int iser_send_control(struct iscsi_conn *conn, struct iscsi_task *task) { struct iser_conn *iser_conn = conn->dd_data; struct iscsi_iser_task *iser_task = task->dd_data; struct iser_tx_desc *mdesc = &iser_task->desc; unsigned long data_seg_len; int err = 0; struct iser_device *device; /* build the tx desc regd header and add it to the tx desc dto */ mdesc->type = ISCSI_TX_CONTROL; iser_create_send_desc(iser_conn, mdesc); device = iser_conn->ib_conn.device; data_seg_len = ntoh24(task->hdr->dlength); if (data_seg_len > 0) { struct ib_sge *tx_dsg = &mdesc->tx_sg[1]; if (task != conn->login_task) { iser_err("data present on non login task!!!\n"); goto send_control_error; } ib_dma_sync_single_for_cpu(device->ib_device, iser_conn->login_req_dma, task->data_count, DMA_TO_DEVICE); memcpy(iser_conn->login_req_buf, task->data, task->data_count); ib_dma_sync_single_for_device(device->ib_device, iser_conn->login_req_dma, task->data_count, DMA_TO_DEVICE); tx_dsg->addr = iser_conn->login_req_dma; tx_dsg->length = task->data_count; tx_dsg->lkey = device->pd->local_dma_lkey; mdesc->num_sge = 2; } if (task == conn->login_task) { iser_dbg("op %x dsl %lx, posting login rx buffer\n", task->hdr->opcode, data_seg_len); err = iser_post_recvl(iser_conn); if (err) goto send_control_error; err = iser_post_rx_bufs(conn, task->hdr); if (err) goto send_control_error; } err = iser_post_send(&iser_conn->ib_conn, mdesc, true); if (!err) return 0; send_control_error: iser_err("conn %p failed err %d\n",conn, err); return err; }
int iser_send_control(struct iscsi_conn *conn, struct iscsi_task *task) { struct iscsi_iser_conn *iser_conn = conn->dd_data; struct iscsi_iser_task *iser_task = task->dd_data; struct iser_tx_desc *mdesc = &iser_task->desc; unsigned long data_seg_len; int err = 0; struct iser_device *device; /* build the tx desc regd header and add it to the tx desc dto */ mdesc->type = ISCSI_TX_CONTROL; iser_create_send_desc(iser_conn->ib_conn, mdesc); device = iser_conn->ib_conn->device; data_seg_len = ntoh24(task->hdr->dlength); if (data_seg_len > 0) { struct ib_sge *tx_dsg = &mdesc->tx_sg[1]; if (task != conn->login_task) { iser_err("data present on non login task!!!\n"); goto send_control_error; } memcpy(iser_conn->ib_conn->login_buf, task->data, task->data_count); tx_dsg->addr = iser_conn->ib_conn->login_dma; tx_dsg->length = data_seg_len; tx_dsg->lkey = device->mr->lkey; mdesc->num_sge = 2; } if (task == conn->login_task) { err = iser_post_recvl(iser_conn->ib_conn); if (err) goto send_control_error; } err = iser_post_send(iser_conn->ib_conn, mdesc); if (!err) return 0; send_control_error: iser_err("conn %p failed err %d\n",conn, err); return err; }