Lines Matching +full:libiscsi +full:- +full:dev

2  * iSCSI Initiator over iSER Data-Path
8 * Copyright (c) 2013-2014 Mellanox Technologies. All rights reserved.
9 * maintained by openib-general@openib.org
21 * - Redistributions of source code must retain the above
25 * - Redistributions in binary form must reproduce the above
114 MODULE_PARM_DESC(pi_enable, "Enable T10-PI offload support (default:disabled)");
123 return -EINVAL; in iscsi_iser_set()
129 * iscsi_iser_recv() - Process a successful recv completion
145 datalen = ntoh24(hdr->dlength); in iscsi_iser_recv()
167 * iscsi_iser_pdu_alloc() - allocate an iscsi-iser PDU
176 struct iscsi_iser_task *iser_task = task->dd_data; in iscsi_iser_pdu_alloc()
178 task->hdr = (struct iscsi_hdr *)&iser_task->desc.iscsi_header; in iscsi_iser_pdu_alloc()
179 task->hdr_max = sizeof(iser_task->desc.iscsi_header); in iscsi_iser_pdu_alloc()
185 * iser_initialize_task_headers() - Initialize task headers
198 struct iser_conn *iser_conn = task->conn->dd_data; in iser_initialize_task_headers()
199 struct iser_device *device = iser_conn->ib_conn.device; in iser_initialize_task_headers()
200 struct iscsi_iser_task *iser_task = task->dd_data; in iser_initialize_task_headers()
203 if (unlikely(iser_conn->state != ISER_CONN_UP)) in iser_initialize_task_headers()
204 return -ENODEV; in iser_initialize_task_headers()
206 dma_addr = ib_dma_map_single(device->ib_device, (void *)tx_desc, in iser_initialize_task_headers()
208 if (ib_dma_mapping_error(device->ib_device, dma_addr)) in iser_initialize_task_headers()
209 return -ENOMEM; in iser_initialize_task_headers()
211 tx_desc->inv_wr.next = NULL; in iser_initialize_task_headers()
212 tx_desc->reg_wr.wr.next = NULL; in iser_initialize_task_headers()
213 tx_desc->mapped = true; in iser_initialize_task_headers()
214 tx_desc->dma_addr = dma_addr; in iser_initialize_task_headers()
215 tx_desc->tx_sg[0].addr = tx_desc->dma_addr; in iser_initialize_task_headers()
216 tx_desc->tx_sg[0].length = ISER_HEADERS_LEN; in iser_initialize_task_headers()
217 tx_desc->tx_sg[0].lkey = device->pd->local_dma_lkey; in iser_initialize_task_headers()
219 iser_task->iser_conn = iser_conn; in iser_initialize_task_headers()
225 * iscsi_iser_task_init() - Initialize iscsi-iser task
230 * Return: Returns zero on success or -ENOMEM when failing
235 struct iscsi_iser_task *iser_task = task->dd_data; in iscsi_iser_task_init()
238 ret = iser_initialize_task_headers(task, &iser_task->desc); in iscsi_iser_task_init()
246 if (!task->sc) in iscsi_iser_task_init()
249 iser_task->command_sent = 0; in iscsi_iser_task_init()
251 iser_task->sc = task->sc; in iscsi_iser_task_init()
257 * iscsi_iser_mtask_xmit() - xmit management (immediate) task
262 * The function can return -EAGAIN in which case caller must
272 iser_dbg("mtask xmit [cid %d itt 0x%x]\n", conn->id, task->itt); in iscsi_iser_mtask_xmit()
279 * - if yes, the task is recycled at iscsi_complete_pdu in iscsi_iser_mtask_xmit()
280 * - if no, the task is recycled at iser_snd_completion in iscsi_iser_mtask_xmit()
288 struct iscsi_r2t_info *r2t = &task->unsol_r2t; in iscsi_iser_task_xmit_unsol_data()
292 /* Send data-out PDUs while there's still unsolicited data to send */ in iscsi_iser_task_xmit_unsol_data()
295 iser_dbg("Sending data-out: itt 0x%x, data count %d\n", in iscsi_iser_task_xmit_unsol_data()
296 hdr.itt, r2t->data_count); in iscsi_iser_task_xmit_unsol_data()
302 r2t->datasn--; in iscsi_iser_task_xmit_unsol_data()
305 r2t->sent += r2t->data_count; in iscsi_iser_task_xmit_unsol_data()
306 iser_dbg("Need to send %d more as data-out PDUs\n", in iscsi_iser_task_xmit_unsol_data()
307 r2t->data_length - r2t->sent); in iscsi_iser_task_xmit_unsol_data()
315 * iscsi_iser_task_xmit() - xmit iscsi-iser task
322 struct iscsi_conn *conn = task->conn; in iscsi_iser_task_xmit()
323 struct iscsi_iser_task *iser_task = task->dd_data; in iscsi_iser_task_xmit()
326 if (!task->sc) in iscsi_iser_task_xmit()
329 if (task->sc->sc_data_direction == DMA_TO_DEVICE) { in iscsi_iser_task_xmit()
330 BUG_ON(scsi_bufflen(task->sc) == 0); in iscsi_iser_task_xmit()
333 task->itt, scsi_bufflen(task->sc), in iscsi_iser_task_xmit()
334 task->imm_count, task->unsol_r2t.data_length); in iscsi_iser_task_xmit()
338 conn->id, task->itt); in iscsi_iser_task_xmit()
341 if (!iser_task->command_sent) { in iscsi_iser_task_xmit()
345 iser_task->command_sent = 1; in iscsi_iser_task_xmit()
348 /* Send unsolicited data-out PDU(s) if necessary */ in iscsi_iser_task_xmit()
357 * iscsi_iser_cleanup_task() - cleanup an iscsi-iser task
361 * been removed in DEVICE_REMOVAL CM event it will bail-out
366 struct iscsi_iser_task *iser_task = task->dd_data; in iscsi_iser_cleanup_task()
367 struct iser_tx_desc *tx_desc = &iser_task->desc; in iscsi_iser_cleanup_task()
368 struct iser_conn *iser_conn = task->conn->dd_data; in iscsi_iser_cleanup_task()
369 struct iser_device *device = iser_conn->ib_conn.device; in iscsi_iser_cleanup_task()
375 if (likely(tx_desc->mapped)) { in iscsi_iser_cleanup_task()
376 ib_dma_unmap_single(device->ib_device, tx_desc->dma_addr, in iscsi_iser_cleanup_task()
378 tx_desc->mapped = false; in iscsi_iser_cleanup_task()
382 if (!task->sc) in iscsi_iser_cleanup_task()
385 if (iser_task->status == ISER_TASK_STATUS_STARTED) { in iscsi_iser_cleanup_task()
386 iser_task->status = ISER_TASK_STATUS_COMPLETED; in iscsi_iser_cleanup_task()
392 * iscsi_iser_check_protection() - check protection information status of task.
396 * Return: zero if no data-integrity errors have occurred
397 * 0x1: data-integrity error occurred in the guard-block
398 * 0x2: data-integrity error occurred in the reference tag
399 * 0x3: data-integrity error occurred in the application tag
405 struct iscsi_iser_task *iser_task = task->dd_data; in iscsi_iser_check_protection()
406 enum iser_data_dir dir = iser_task->dir[ISER_DIR_IN] ? in iscsi_iser_check_protection()
413 * iscsi_iser_conn_create() - create a new iscsi-iser connection
430 conn = cls_conn->dd_data; in iscsi_iser_conn_create()
434 * this not set in iscsi_conn_setup - FIXME in iscsi_iser_conn_create()
436 conn->max_recv_dlength = ISER_RECV_DATA_SEG_LEN; in iscsi_iser_conn_create()
442 * iscsi_iser_conn_bind() - bind iscsi and iser connection structures
445 * @transport_eph: transport end-point handle
449 * -EINVAL in case end-point doesn't exists anymore or iser connection
456 struct iscsi_conn *conn = cls_conn->dd_data; in iscsi_iser_conn_bind()
471 return -EINVAL; in iscsi_iser_conn_bind()
473 iser_conn = ep->dd_data; in iscsi_iser_conn_bind()
475 mutex_lock(&iser_conn->state_mutex); in iscsi_iser_conn_bind()
476 if (iser_conn->state != ISER_CONN_UP) { in iscsi_iser_conn_bind()
477 error = -EINVAL; in iscsi_iser_conn_bind()
479 iser_conn, iser_conn->state); in iscsi_iser_conn_bind()
483 error = iser_alloc_rx_descriptors(iser_conn, conn->session); in iscsi_iser_conn_bind()
492 conn->dd_data = iser_conn; in iscsi_iser_conn_bind()
493 iser_conn->iscsi_conn = conn; in iscsi_iser_conn_bind()
497 mutex_unlock(&iser_conn->state_mutex); in iscsi_iser_conn_bind()
502 * iscsi_iser_conn_start() - start iscsi-iser connection
505 * Notes: Here iser intialize (or re-initialize) stop_completion as
514 iscsi_conn = cls_conn->dd_data; in iscsi_iser_conn_start()
515 iser_conn = iscsi_conn->dd_data; in iscsi_iser_conn_start()
516 reinit_completion(&iser_conn->stop_completion); in iscsi_iser_conn_start()
522 * iscsi_iser_conn_stop() - stop iscsi-iser connection
533 struct iscsi_conn *conn = cls_conn->dd_data; in iscsi_iser_conn_stop()
534 struct iser_conn *iser_conn = conn->dd_data; in iscsi_iser_conn_stop()
543 mutex_lock(&iser_conn->state_mutex); in iscsi_iser_conn_stop()
549 iser_conn->iscsi_conn = NULL; in iscsi_iser_conn_stop()
550 conn->dd_data = NULL; in iscsi_iser_conn_stop()
553 complete(&iser_conn->stop_completion); in iscsi_iser_conn_stop()
554 mutex_unlock(&iser_conn->state_mutex); in iscsi_iser_conn_stop()
561 * iscsi_iser_session_destroy() - destroy iscsi-iser session
594 * iscsi_iser_session_create() - create an iscsi-iser session
595 * @ep: iscsi end-point handle
618 shost->transportt = iscsi_iser_scsi_transport; in iscsi_iser_session_create()
619 shost->cmd_per_lun = qdepth; in iscsi_iser_session_create()
620 shost->max_lun = iscsi_max_lun; in iscsi_iser_session_create()
621 shost->max_id = 0; in iscsi_iser_session_create()
622 shost->max_channel = 0; in iscsi_iser_session_create()
623 shost->max_cmd_len = 16; in iscsi_iser_session_create()
626 * older userspace tools (before 2.0-870) did not pass us in iscsi_iser_session_create()
630 iser_conn = ep->dd_data; in iscsi_iser_session_create()
631 shost->sg_tablesize = iser_conn->scsi_sg_tablesize; in iscsi_iser_session_create()
632 shost->can_queue = min_t(u16, cmds_max, iser_conn->max_cmds); in iscsi_iser_session_create()
634 mutex_lock(&iser_conn->state_mutex); in iscsi_iser_session_create()
635 if (iser_conn->state != ISER_CONN_UP) { in iscsi_iser_session_create()
638 mutex_unlock(&iser_conn->state_mutex); in iscsi_iser_session_create()
642 ib_conn = &iser_conn->ib_conn; in iscsi_iser_session_create()
643 ib_dev = ib_conn->device->ib_device; in iscsi_iser_session_create()
644 if (ib_conn->pi_support) { in iscsi_iser_session_create()
645 u32 sig_caps = ib_dev->attrs.sig_prot_cap; in iscsi_iser_session_create()
647 shost->sg_prot_tablesize = shost->sg_tablesize; in iscsi_iser_session_create()
653 if (!(ib_dev->attrs.kernel_cap_flags & IBK_SG_GAPS_REG)) in iscsi_iser_session_create()
654 shost->virt_boundary_mask = SZ_4K - 1; in iscsi_iser_session_create()
656 if (iscsi_host_add(shost, ib_dev->dev.parent)) { in iscsi_iser_session_create()
657 mutex_unlock(&iser_conn->state_mutex); in iscsi_iser_session_create()
660 mutex_unlock(&iser_conn->state_mutex); in iscsi_iser_session_create()
662 shost->can_queue = min_t(u16, cmds_max, ISER_DEF_XMIT_CMDS_MAX); in iscsi_iser_session_create()
667 max_fr_sectors = (shost->sg_tablesize * PAGE_SIZE) >> 9; in iscsi_iser_session_create()
668 shost->max_sectors = min(iser_max_sectors, max_fr_sectors); in iscsi_iser_session_create()
671 iser_conn, shost->sg_tablesize, in iscsi_iser_session_create()
672 shost->max_sectors); in iscsi_iser_session_create()
674 if (shost->max_sectors < iser_max_sectors) in iscsi_iser_session_create()
676 iser_max_sectors, shost->max_sectors); in iscsi_iser_session_create()
679 shost->can_queue, 0, in iscsi_iser_session_create()
707 return -EPROTO; in iscsi_iser_set_param()
714 return -EPROTO; in iscsi_iser_set_param()
721 return -EPROTO; in iscsi_iser_set_param()
728 return -EPROTO; in iscsi_iser_set_param()
739 * iscsi_iser_conn_get_stats() - get iscsi connection statistics
748 struct iscsi_conn *conn = cls_conn->dd_data; in iscsi_iser_conn_get_stats()
750 stats->txdata_octets = conn->txdata_octets; in iscsi_iser_conn_get_stats()
751 stats->rxdata_octets = conn->rxdata_octets; in iscsi_iser_conn_get_stats()
752 stats->scsicmd_pdus = conn->scsicmd_pdus_cnt; in iscsi_iser_conn_get_stats()
753 stats->dataout_pdus = conn->dataout_pdus_cnt; in iscsi_iser_conn_get_stats()
754 stats->scsirsp_pdus = conn->scsirsp_pdus_cnt; in iscsi_iser_conn_get_stats()
755 stats->datain_pdus = conn->datain_pdus_cnt; /* always 0 */ in iscsi_iser_conn_get_stats()
756 stats->r2t_pdus = conn->r2t_pdus_cnt; /* always 0 */ in iscsi_iser_conn_get_stats()
757 stats->tmfcmd_pdus = conn->tmfcmd_pdus_cnt; in iscsi_iser_conn_get_stats()
758 stats->tmfrsp_pdus = conn->tmfrsp_pdus_cnt; in iscsi_iser_conn_get_stats()
759 stats->custom_length = 0; in iscsi_iser_conn_get_stats()
765 struct iser_conn *iser_conn = ep->dd_data; in iscsi_iser_get_ep_param()
770 if (!iser_conn || !iser_conn->ib_conn.cma_id) in iscsi_iser_get_ep_param()
771 return -ENOTCONN; in iscsi_iser_get_ep_param()
774 &iser_conn->ib_conn.cma_id->route.addr.dst_addr, in iscsi_iser_get_ep_param()
779 return -ENOSYS; in iscsi_iser_get_ep_param()
783 * iscsi_iser_ep_connect() - Initiate iSER connection establishment
807 return ERR_PTR(-ENOMEM); in iscsi_iser_ep_connect()
811 err = -ENOMEM; in iscsi_iser_ep_connect()
815 ep->dd_data = iser_conn; in iscsi_iser_ep_connect()
816 iser_conn->ep = ep; in iscsi_iser_ep_connect()
830 * iscsi_iser_ep_poll() - poll for iser connection establishment to complete
838 * (libiscsi will retry will kick in) or -1 if interrupted by signal
844 struct iser_conn *iser_conn = ep->dd_data; in iscsi_iser_ep_poll()
847 rc = wait_for_completion_interruptible_timeout(&iser_conn->up_completion, in iscsi_iser_ep_poll()
851 mutex_lock(&iser_conn->state_mutex); in iscsi_iser_ep_poll()
852 if (iser_conn->state == ISER_CONN_TERMINATING || in iscsi_iser_ep_poll()
853 iser_conn->state == ISER_CONN_DOWN) in iscsi_iser_ep_poll()
854 rc = -1; in iscsi_iser_ep_poll()
855 mutex_unlock(&iser_conn->state_mutex); in iscsi_iser_ep_poll()
869 * iscsi_iser_ep_disconnect() - Initiate connection teardown process
879 struct iser_conn *iser_conn = ep->dd_data; in iscsi_iser_ep_disconnect()
883 mutex_lock(&iser_conn->state_mutex); in iscsi_iser_ep_disconnect()
892 if (iser_conn->iscsi_conn) { in iscsi_iser_ep_disconnect()
893 INIT_WORK(&iser_conn->release_work, iser_release_work); in iscsi_iser_ep_disconnect()
894 queue_work(release_wq, &iser_conn->release_work); in iscsi_iser_ep_disconnect()
895 mutex_unlock(&iser_conn->state_mutex); in iscsi_iser_ep_disconnect()
897 iser_conn->state = ISER_CONN_DOWN; in iscsi_iser_ep_disconnect()
898 mutex_unlock(&iser_conn->state_mutex); in iscsi_iser_ep_disconnect()
972 .this_id = -1,
1028 return -ENOMEM; in iser_init()
1039 err = -ENOMEM; in iser_init()
1047 err = -EINVAL; in iser_init()