static void iser_cq_tasklet_fn(unsigned long data) { struct iser_device *device = (struct iser_device *)data; struct ib_cq *cq = device->cq; struct ib_wc wc; struct iser_desc *desc; unsigned long xfer_len; while (ib_poll_cq(cq, 1, &wc) == 1) { desc = (struct iser_desc *) (unsigned long) wc.wr_id; BUG_ON(desc == NULL); if (wc.status == IB_WC_SUCCESS) { if (desc->type == ISCSI_RX) { xfer_len = (unsigned long)wc.byte_len; iser_rcv_completion(desc, xfer_len); } else iser_snd_completion(desc); } else { iser_err("comp w. error op %d status %d\n",desc->type,wc.status); iser_handle_comp_error(desc); } } ib_req_notify_cq(cq, IB_CQ_NEXT_COMP); }
static int iser_drain_tx_cq(struct iser_device *device) { struct ib_cq *cq = device->tx_cq; struct ib_wc wc; struct iser_tx_desc *tx_desc; struct iser_conn *ib_conn; int completed_tx = 0; while (ib_poll_cq(cq, 1, &wc) == 1) { tx_desc = (struct iser_tx_desc *) (unsigned long) wc.wr_id; ib_conn = wc.qp->qp_context; if (wc.status == IB_WC_SUCCESS) { if (wc.opcode == IB_WC_SEND) iser_snd_completion(tx_desc, ib_conn); else iser_err("expected opcode %d got %d\n", IB_WC_SEND, wc.opcode); } else { iser_err("tx id %llx status %d vend_err %x\n", wc.wr_id, wc.status, wc.vendor_err); atomic_dec(&ib_conn->post_send_buf_count); iser_handle_comp_error(tx_desc, ib_conn); } completed_tx++; } return completed_tx; }
static void iser_cq_tasklet_fn(unsigned long data) { struct iser_device *device = (struct iser_device *)data; struct ib_cq *cq = device->cq; struct ib_wc wc; struct iser_desc *desc; unsigned long xfer_len; while (ib_poll_cq(cq, 1, &wc) == 1) { desc = (struct iser_desc *) (unsigned long) wc.wr_id; BUG_ON(desc == NULL); if (wc.status == IB_WC_SUCCESS) { if (desc->type == ISCSI_RX) { xfer_len = (unsigned long)wc.byte_len; iser_rcv_completion(desc, xfer_len); } else /* type == ISCSI_TX_CONTROL/SCSI_CMD/DOUT */ iser_snd_completion(desc); } else { iser_err("comp w. error op %d status %d\n",desc->type,wc.status); iser_handle_comp_error(desc); } } /* #warning "it is assumed here that arming CQ only once its empty" * * " would not cause interrupts to be missed" */ ib_req_notify_cq(cq, IB_CQ_NEXT_COMP); }