Lines Matching refs:vhost

182 static int ibmvfc_check_caps(struct ibmvfc_host *vhost, unsigned long cap_flags)  in ibmvfc_check_caps()  argument
184 u64 host_caps = be64_to_cpu(vhost->login_buf->resp.capabilities); in ibmvfc_check_caps()
189 static struct ibmvfc_fcp_cmd_iu *ibmvfc_get_fcp_iu(struct ibmvfc_host *vhost, in ibmvfc_get_fcp_iu() argument
192 if (ibmvfc_check_caps(vhost, IBMVFC_HANDLE_VF_WWPN)) in ibmvfc_get_fcp_iu()
198 static struct ibmvfc_fcp_rsp *ibmvfc_get_fcp_rsp(struct ibmvfc_host *vhost, in ibmvfc_get_fcp_rsp() argument
201 if (ibmvfc_check_caps(vhost, IBMVFC_HANDLE_VF_WWPN)) in ibmvfc_get_fcp_rsp()
215 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_trc_start() local
218 struct ibmvfc_fcp_cmd_iu *iu = ibmvfc_get_fcp_iu(vhost, vfc_cmd); in ibmvfc_trc_start()
220 int index = atomic_inc_return(&vhost->trace_index) & IBMVFC_TRACE_INDEX_MASK; in ibmvfc_trc_start()
222 entry = &vhost->trace[index]; in ibmvfc_trc_start()
251 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_trc_end() local
254 struct ibmvfc_fcp_cmd_iu *iu = ibmvfc_get_fcp_iu(vhost, vfc_cmd); in ibmvfc_trc_end()
255 struct ibmvfc_fcp_rsp *rsp = ibmvfc_get_fcp_rsp(vhost, vfc_cmd); in ibmvfc_trc_end()
257 int index = atomic_inc_return(&vhost->trace_index) & IBMVFC_TRACE_INDEX_MASK; in ibmvfc_trc_end()
259 entry = &vhost->trace[index]; in ibmvfc_trc_end()
336 static int ibmvfc_get_err_result(struct ibmvfc_host *vhost, struct ibmvfc_cmd *vfc_cmd) in ibmvfc_get_err_result() argument
339 struct ibmvfc_fcp_rsp *rsp = ibmvfc_get_fcp_rsp(vhost, vfc_cmd); in ibmvfc_get_err_result()
554 static int ibmvfc_set_host_state(struct ibmvfc_host *vhost, in ibmvfc_set_host_state() argument
559 switch (vhost->state) { in ibmvfc_set_host_state()
564 vhost->state = state; in ibmvfc_set_host_state()
577 static void ibmvfc_set_host_action(struct ibmvfc_host *vhost, in ibmvfc_set_host_action() argument
582 if (vhost->action == IBMVFC_HOST_ACTION_INIT_WAIT) in ibmvfc_set_host_action()
583 vhost->action = action; in ibmvfc_set_host_action()
586 if (vhost->action == IBMVFC_HOST_ACTION_LOGO) in ibmvfc_set_host_action()
587 vhost->action = action; in ibmvfc_set_host_action()
590 if (vhost->action == IBMVFC_HOST_ACTION_INIT) in ibmvfc_set_host_action()
591 vhost->action = action; in ibmvfc_set_host_action()
594 switch (vhost->action) { in ibmvfc_set_host_action()
598 vhost->action = action; in ibmvfc_set_host_action()
605 if (vhost->action == IBMVFC_HOST_ACTION_ALLOC_TGTS) in ibmvfc_set_host_action()
606 vhost->action = action; in ibmvfc_set_host_action()
610 vhost->action = action; in ibmvfc_set_host_action()
619 switch (vhost->action) { in ibmvfc_set_host_action()
624 vhost->action = action; in ibmvfc_set_host_action()
638 static void ibmvfc_reinit_host(struct ibmvfc_host *vhost) in ibmvfc_reinit_host() argument
640 if (vhost->action == IBMVFC_HOST_ACTION_NONE && in ibmvfc_reinit_host()
641 vhost->state == IBMVFC_ACTIVE) { in ibmvfc_reinit_host()
642 if (!ibmvfc_set_host_state(vhost, IBMVFC_INITIALIZING)) { in ibmvfc_reinit_host()
643 scsi_block_requests(vhost->host); in ibmvfc_reinit_host()
644 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY); in ibmvfc_reinit_host()
647 vhost->reinit = 1; in ibmvfc_reinit_host()
649 wake_up(&vhost->work_wait_q); in ibmvfc_reinit_host()
662 wake_up(&tgt->vhost->work_wait_q); in ibmvfc_del_tgt()
671 static void ibmvfc_link_down(struct ibmvfc_host *vhost, in ibmvfc_link_down() argument
677 scsi_block_requests(vhost->host); in ibmvfc_link_down()
678 list_for_each_entry(tgt, &vhost->targets, queue) in ibmvfc_link_down()
680 ibmvfc_set_host_state(vhost, state); in ibmvfc_link_down()
681 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_DEL); in ibmvfc_link_down()
682 vhost->events_to_log |= IBMVFC_AE_LINKDOWN; in ibmvfc_link_down()
683 wake_up(&vhost->work_wait_q); in ibmvfc_link_down()
694 static void ibmvfc_init_host(struct ibmvfc_host *vhost) in ibmvfc_init_host() argument
698 if (vhost->action == IBMVFC_HOST_ACTION_INIT_WAIT) { in ibmvfc_init_host()
699 if (++vhost->init_retries > IBMVFC_MAX_HOST_INIT_RETRIES) { in ibmvfc_init_host()
700 dev_err(vhost->dev, in ibmvfc_init_host()
702 ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE); in ibmvfc_init_host()
707 if (!ibmvfc_set_host_state(vhost, IBMVFC_INITIALIZING)) { in ibmvfc_init_host()
708 memset(vhost->async_crq.msgs.async, 0, PAGE_SIZE); in ibmvfc_init_host()
709 vhost->async_crq.cur = 0; in ibmvfc_init_host()
711 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_init_host()
712 if (vhost->client_migrated) in ibmvfc_init_host()
718 scsi_block_requests(vhost->host); in ibmvfc_init_host()
719 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT); in ibmvfc_init_host()
720 vhost->job_step = ibmvfc_npiv_login; in ibmvfc_init_host()
721 wake_up(&vhost->work_wait_q); in ibmvfc_init_host()
734 static int ibmvfc_send_crq(struct ibmvfc_host *vhost, u64 word1, u64 word2) in ibmvfc_send_crq() argument
736 struct vio_dev *vdev = to_vio_dev(vhost->dev); in ibmvfc_send_crq()
740 static int ibmvfc_send_sub_crq(struct ibmvfc_host *vhost, u64 cookie, u64 word1, in ibmvfc_send_sub_crq() argument
743 struct vio_dev *vdev = to_vio_dev(vhost->dev); in ibmvfc_send_sub_crq()
756 static int ibmvfc_send_crq_init(struct ibmvfc_host *vhost) in ibmvfc_send_crq_init() argument
758 ibmvfc_dbg(vhost, "Sending CRQ init\n"); in ibmvfc_send_crq_init()
759 return ibmvfc_send_crq(vhost, 0xC001000000000000LL, 0); in ibmvfc_send_crq_init()
769 static int ibmvfc_send_crq_init_complete(struct ibmvfc_host *vhost) in ibmvfc_send_crq_init_complete() argument
771 ibmvfc_dbg(vhost, "Sending CRQ init complete\n"); in ibmvfc_send_crq_init_complete()
772 return ibmvfc_send_crq(vhost, 0xC002000000000000LL, 0); in ibmvfc_send_crq_init_complete()
783 static int ibmvfc_init_event_pool(struct ibmvfc_host *vhost, in ibmvfc_init_event_pool() argument
799 pool->iu_storage = dma_alloc_coherent(vhost->dev, in ibmvfc_init_event_pool()
826 evt->vhost = vhost; in ibmvfc_init_event_pool()
842 static void ibmvfc_free_event_pool(struct ibmvfc_host *vhost, in ibmvfc_free_event_pool() argument
853 dma_pool_free(vhost->sg_pool, in ibmvfc_free_event_pool()
859 dma_free_coherent(vhost->dev, in ibmvfc_free_event_pool()
872 static void ibmvfc_free_queue(struct ibmvfc_host *vhost, in ibmvfc_free_queue() argument
875 struct device *dev = vhost->dev; in ibmvfc_free_queue()
881 ibmvfc_free_event_pool(vhost, queue); in ibmvfc_free_queue()
891 static void ibmvfc_release_crq_queue(struct ibmvfc_host *vhost) in ibmvfc_release_crq_queue() argument
894 struct vio_dev *vdev = to_vio_dev(vhost->dev); in ibmvfc_release_crq_queue()
895 struct ibmvfc_queue *crq = &vhost->crq; in ibmvfc_release_crq_queue()
897 ibmvfc_dbg(vhost, "Releasing CRQ\n"); in ibmvfc_release_crq_queue()
898 free_irq(vdev->irq, vhost); in ibmvfc_release_crq_queue()
899 tasklet_kill(&vhost->tasklet); in ibmvfc_release_crq_queue()
906 vhost->state = IBMVFC_NO_CRQ; in ibmvfc_release_crq_queue()
907 vhost->logged_in = 0; in ibmvfc_release_crq_queue()
909 ibmvfc_free_queue(vhost, crq); in ibmvfc_release_crq_queue()
919 static int ibmvfc_reenable_crq_queue(struct ibmvfc_host *vhost) in ibmvfc_reenable_crq_queue() argument
922 struct vio_dev *vdev = to_vio_dev(vhost->dev); in ibmvfc_reenable_crq_queue()
925 ibmvfc_dereg_sub_crqs(vhost); in ibmvfc_reenable_crq_queue()
935 dev_err(vhost->dev, "Error enabling adapter (rc=%d)\n", rc); in ibmvfc_reenable_crq_queue()
937 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_reenable_crq_queue()
938 spin_lock(vhost->crq.q_lock); in ibmvfc_reenable_crq_queue()
939 vhost->do_enquiry = 1; in ibmvfc_reenable_crq_queue()
940 vhost->using_channels = 0; in ibmvfc_reenable_crq_queue()
941 spin_unlock(vhost->crq.q_lock); in ibmvfc_reenable_crq_queue()
942 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_reenable_crq_queue()
944 ibmvfc_reg_sub_crqs(vhost); in ibmvfc_reenable_crq_queue()
956 static int ibmvfc_reset_crq(struct ibmvfc_host *vhost) in ibmvfc_reset_crq() argument
960 struct vio_dev *vdev = to_vio_dev(vhost->dev); in ibmvfc_reset_crq()
961 struct ibmvfc_queue *crq = &vhost->crq; in ibmvfc_reset_crq()
963 ibmvfc_dereg_sub_crqs(vhost); in ibmvfc_reset_crq()
972 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_reset_crq()
973 spin_lock(vhost->crq.q_lock); in ibmvfc_reset_crq()
974 vhost->state = IBMVFC_NO_CRQ; in ibmvfc_reset_crq()
975 vhost->logged_in = 0; in ibmvfc_reset_crq()
976 vhost->do_enquiry = 1; in ibmvfc_reset_crq()
977 vhost->using_channels = 0; in ibmvfc_reset_crq()
989 dev_warn(vhost->dev, "Partner adapter not ready\n"); in ibmvfc_reset_crq()
991 dev_warn(vhost->dev, "Couldn't register crq (rc=%d)\n", rc); in ibmvfc_reset_crq()
993 spin_unlock(vhost->crq.q_lock); in ibmvfc_reset_crq()
994 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_reset_crq()
996 ibmvfc_reg_sub_crqs(vhost); in ibmvfc_reset_crq()
1111 static void ibmvfc_purge_requests(struct ibmvfc_host *vhost, int error_code) in ibmvfc_purge_requests() argument
1114 struct ibmvfc_queue *queues = vhost->scsi_scrqs.scrqs; in ibmvfc_purge_requests()
1119 if (vhost->using_channels) in ibmvfc_purge_requests()
1120 hwqs = vhost->scsi_scrqs.active_queues; in ibmvfc_purge_requests()
1122 ibmvfc_dbg(vhost, "Purging all requests\n"); in ibmvfc_purge_requests()
1123 spin_lock_irqsave(&vhost->crq.l_lock, flags); in ibmvfc_purge_requests()
1124 list_for_each_entry_safe(evt, pos, &vhost->crq.sent, queue_list) in ibmvfc_purge_requests()
1126 list_splice_init(&vhost->crq.sent, &vhost->purge); in ibmvfc_purge_requests()
1127 spin_unlock_irqrestore(&vhost->crq.l_lock, flags); in ibmvfc_purge_requests()
1134 list_splice_init(&queues[i].sent, &vhost->purge); in ibmvfc_purge_requests()
1144 static void ibmvfc_hard_reset_host(struct ibmvfc_host *vhost) in ibmvfc_hard_reset_host() argument
1146 ibmvfc_purge_requests(vhost, DID_ERROR); in ibmvfc_hard_reset_host()
1147 ibmvfc_link_down(vhost, IBMVFC_LINK_DOWN); in ibmvfc_hard_reset_host()
1148 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_RESET); in ibmvfc_hard_reset_host()
1155 static void __ibmvfc_reset_host(struct ibmvfc_host *vhost) in __ibmvfc_reset_host() argument
1157 if (vhost->logged_in && vhost->action != IBMVFC_HOST_ACTION_LOGO_WAIT && in __ibmvfc_reset_host()
1158 !ibmvfc_set_host_state(vhost, IBMVFC_INITIALIZING)) { in __ibmvfc_reset_host()
1159 scsi_block_requests(vhost->host); in __ibmvfc_reset_host()
1160 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_LOGO); in __ibmvfc_reset_host()
1161 vhost->job_step = ibmvfc_npiv_logout; in __ibmvfc_reset_host()
1162 wake_up(&vhost->work_wait_q); in __ibmvfc_reset_host()
1164 ibmvfc_hard_reset_host(vhost); in __ibmvfc_reset_host()
1171 static void ibmvfc_reset_host(struct ibmvfc_host *vhost) in ibmvfc_reset_host() argument
1175 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_reset_host()
1176 __ibmvfc_reset_host(vhost); in ibmvfc_reset_host()
1177 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_reset_host()
1187 static int ibmvfc_retry_host_init(struct ibmvfc_host *vhost) in ibmvfc_retry_host_init() argument
1191 if (vhost->action == IBMVFC_HOST_ACTION_INIT_WAIT) { in ibmvfc_retry_host_init()
1192 vhost->delay_init = 1; in ibmvfc_retry_host_init()
1193 if (++vhost->init_retries > IBMVFC_MAX_HOST_INIT_RETRIES) { in ibmvfc_retry_host_init()
1194 dev_err(vhost->dev, in ibmvfc_retry_host_init()
1196 ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE); in ibmvfc_retry_host_init()
1197 } else if (vhost->init_retries == IBMVFC_MAX_HOST_INIT_RETRIES) in ibmvfc_retry_host_init()
1198 __ibmvfc_reset_host(vhost); in ibmvfc_retry_host_init()
1200 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT); in ibmvfc_retry_host_init()
1205 wake_up(&vhost->work_wait_q); in ibmvfc_retry_host_init()
1219 struct ibmvfc_host *vhost = shost_priv(shost); in __ibmvfc_get_target() local
1222 list_for_each_entry(tgt, &vhost->targets, queue) in __ibmvfc_get_target()
1258 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_get_host_speed() local
1262 if (vhost->state == IBMVFC_ACTIVE) { in ibmvfc_get_host_speed()
1263 switch (be64_to_cpu(vhost->login_buf->resp.link_speed) / 100) { in ibmvfc_get_host_speed()
1283 ibmvfc_log(vhost, 3, "Unknown port speed: %lld Gbit\n", in ibmvfc_get_host_speed()
1284 be64_to_cpu(vhost->login_buf->resp.link_speed) / 100); in ibmvfc_get_host_speed()
1302 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_get_host_port_state() local
1306 switch (vhost->state) { in ibmvfc_get_host_port_state()
1325 ibmvfc_log(vhost, 3, "Unknown port state: %d\n", vhost->state); in ibmvfc_get_host_port_state()
1411 static int ibmvfc_wait_while_resetting(struct ibmvfc_host *vhost) in ibmvfc_wait_while_resetting() argument
1413 long timeout = wait_event_timeout(vhost->init_wait_q, in ibmvfc_wait_while_resetting()
1414 ((vhost->state == IBMVFC_ACTIVE || in ibmvfc_wait_while_resetting()
1415 vhost->state == IBMVFC_HOST_OFFLINE || in ibmvfc_wait_while_resetting()
1416 vhost->state == IBMVFC_LINK_DEAD) && in ibmvfc_wait_while_resetting()
1417 vhost->action == IBMVFC_HOST_ACTION_NONE), in ibmvfc_wait_while_resetting()
1432 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_issue_fc_host_lip() local
1434 dev_err(vhost->dev, "Initiating host LIP. Resetting connection\n"); in ibmvfc_issue_fc_host_lip()
1435 ibmvfc_reset_host(vhost); in ibmvfc_issue_fc_host_lip()
1436 return ibmvfc_wait_while_resetting(vhost); in ibmvfc_issue_fc_host_lip()
1446 static void ibmvfc_gather_partition_info(struct ibmvfc_host *vhost) in ibmvfc_gather_partition_info() argument
1458 strncpy(vhost->partition_name, name, sizeof(vhost->partition_name)); in ibmvfc_gather_partition_info()
1461 vhost->partition_number = *num; in ibmvfc_gather_partition_info()
1472 static void ibmvfc_set_login_info(struct ibmvfc_host *vhost) in ibmvfc_set_login_info() argument
1474 struct ibmvfc_npiv_login *login_info = &vhost->login_info; in ibmvfc_set_login_info()
1475 struct ibmvfc_queue *async_crq = &vhost->async_crq; in ibmvfc_set_login_info()
1476 struct device_node *of_node = vhost->dev->of_node; in ibmvfc_set_login_info()
1485 login_info->partition_num = cpu_to_be32(vhost->partition_number); in ibmvfc_set_login_info()
1489 if (vhost->client_migrated) in ibmvfc_set_login_info()
1495 if (vhost->mq_enabled || vhost->using_channels) in ibmvfc_set_login_info()
1498 login_info->async.va = cpu_to_be64(vhost->async_crq.msg_token); in ibmvfc_set_login_info()
1501 strncpy(login_info->partition_name, vhost->partition_name, IBMVFC_MAX_NAME); in ibmvfc_set_login_info()
1503 dev_name(&vhost->host->shost_gendev), IBMVFC_MAX_NAME); in ibmvfc_set_login_info()
1506 location = location ? location : dev_name(vhost->dev); in ibmvfc_set_login_info()
1542 spin_lock_irqsave(evt->vhost->host->host_lock, flags); in ibmvfc_locked_done()
1544 spin_unlock_irqrestore(evt->vhost->host->host_lock, flags); in ibmvfc_locked_done()
1606 struct ibmvfc_host *vhost = dev_get_drvdata(dev); in ibmvfc_map_sg_data() local
1607 struct ibmvfc_fcp_cmd_iu *iu = ibmvfc_get_fcp_iu(evt->vhost, vfc_cmd); in ibmvfc_map_sg_data()
1617 if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL) in ibmvfc_map_sg_data()
1638 evt->ext_list = dma_pool_alloc(vhost->sg_pool, GFP_ATOMIC, in ibmvfc_map_sg_data()
1643 if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL) in ibmvfc_map_sg_data()
1666 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_timeout() local
1667 dev_err(vhost->dev, "Command timed out (%p). Resetting connection\n", evt); in ibmvfc_timeout()
1668 ibmvfc_reset_host(vhost); in ibmvfc_timeout()
1680 struct ibmvfc_host *vhost, unsigned long timeout) in ibmvfc_send_event() argument
1709 rc = ibmvfc_send_sub_crq(vhost, in ibmvfc_send_event()
1715 rc = ibmvfc_send_crq(vhost, be64_to_cpu(crq_as_u64[0]), in ibmvfc_send_event()
1731 dev_warn(vhost->dev, "Send warning. Receive queue closed, will retry.\n"); in ibmvfc_send_event()
1738 dev_err(vhost->dev, "Send error (rc=%d)\n", rc); in ibmvfc_send_event()
1762 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_log_error() local
1763 struct ibmvfc_fcp_rsp *rsp = ibmvfc_get_fcp_rsp(vhost, vfc_cmd); in ibmvfc_log_error()
1775 if (!logerr && (vhost->log_level <= (IBMVFC_DEFAULT_LOG_LEVEL + 1))) in ibmvfc_log_error()
1794 struct ibmvfc_host *vhost = shost_priv(sdev->host); in ibmvfc_relogin() local
1799 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_relogin()
1800 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_relogin()
1807 ibmvfc_reinit_host(vhost); in ibmvfc_relogin()
1808 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_relogin()
1820 struct ibmvfc_fcp_rsp *rsp = ibmvfc_get_fcp_rsp(evt->vhost, vfc_cmd); in ibmvfc_scsi_done()
1834 cmnd->result = ibmvfc_get_err_result(evt->vhost, vfc_cmd); in ibmvfc_scsi_done()
1870 static inline int ibmvfc_host_chkready(struct ibmvfc_host *vhost) in ibmvfc_host_chkready() argument
1874 switch (vhost->state) { in ibmvfc_host_chkready()
1896 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_init_vfc_cmd() local
1898 struct ibmvfc_fcp_cmd_iu *iu = ibmvfc_get_fcp_iu(vhost, vfc_cmd); in ibmvfc_init_vfc_cmd()
1899 struct ibmvfc_fcp_rsp *rsp = ibmvfc_get_fcp_rsp(vhost, vfc_cmd); in ibmvfc_init_vfc_cmd()
1903 if (ibmvfc_check_caps(vhost, IBMVFC_HANDLE_VF_WWPN)) { in ibmvfc_init_vfc_cmd()
1930 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_queuecommand() local
1941 unlikely((rc = ibmvfc_host_chkready(vhost)))) { in ibmvfc_queuecommand()
1948 if (vhost->using_channels) { in ibmvfc_queuecommand()
1949 scsi_channel = hwq % vhost->scsi_scrqs.active_queues; in ibmvfc_queuecommand()
1950 evt = ibmvfc_get_event(&vhost->scsi_scrqs.scrqs[scsi_channel]); in ibmvfc_queuecommand()
1951 evt->hwq = hwq % vhost->scsi_scrqs.active_queues; in ibmvfc_queuecommand()
1953 evt = ibmvfc_get_event(&vhost->crq); in ibmvfc_queuecommand()
1959 iu = ibmvfc_get_fcp_iu(vhost, vfc_cmd); in ibmvfc_queuecommand()
1971 if (likely(!(rc = ibmvfc_map_sg_data(cmnd, evt, vfc_cmd, vhost->dev)))) in ibmvfc_queuecommand()
1972 return ibmvfc_send_event(evt, vhost, 0); in ibmvfc_queuecommand()
1978 if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL) in ibmvfc_queuecommand()
2008 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_bsg_timeout_done() local
2011 vhost->aborting_passthru = 0; in ibmvfc_bsg_timeout_done()
2012 dev_info(vhost->dev, "Passthru command cancelled\n"); in ibmvfc_bsg_timeout_done()
2024 struct ibmvfc_host *vhost = shost_priv(fc_bsg_to_shost(job)); in ibmvfc_bsg_timeout() local
2032 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_bsg_timeout()
2033 if (vhost->aborting_passthru || vhost->state != IBMVFC_ACTIVE) { in ibmvfc_bsg_timeout()
2034 __ibmvfc_reset_host(vhost); in ibmvfc_bsg_timeout()
2035 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_bsg_timeout()
2039 vhost->aborting_passthru = 1; in ibmvfc_bsg_timeout()
2040 evt = ibmvfc_get_event(&vhost->crq); in ibmvfc_bsg_timeout()
2051 rc = ibmvfc_send_event(evt, vhost, default_timeout); in ibmvfc_bsg_timeout()
2054 vhost->aborting_passthru = 0; in ibmvfc_bsg_timeout()
2055 dev_err(vhost->dev, "Failed to send cancel event. rc=%d\n", rc); in ibmvfc_bsg_timeout()
2058 dev_info(vhost->dev, "Cancelling passthru command to port id 0x%lx\n", in ibmvfc_bsg_timeout()
2061 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_bsg_timeout()
2075 static int ibmvfc_bsg_plogi(struct ibmvfc_host *vhost, unsigned int port_id) in ibmvfc_bsg_plogi() argument
2085 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_bsg_plogi()
2086 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_bsg_plogi()
2095 if (unlikely((rc = ibmvfc_host_chkready(vhost)))) in ibmvfc_bsg_plogi()
2098 evt = ibmvfc_get_event(&vhost->crq); in ibmvfc_bsg_plogi()
2109 rc = ibmvfc_send_event(evt, vhost, default_timeout); in ibmvfc_bsg_plogi()
2110 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_bsg_plogi()
2120 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_bsg_plogi()
2123 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_bsg_plogi()
2137 struct ibmvfc_host *vhost = shost_priv(fc_bsg_to_shost(job)); in ibmvfc_bsg_request() local
2178 if (!mutex_trylock(&vhost->passthru_mutex)) in ibmvfc_bsg_request()
2182 req_seg = dma_map_sg(vhost->dev, job->request_payload.sg_list, in ibmvfc_bsg_request()
2186 mutex_unlock(&vhost->passthru_mutex); in ibmvfc_bsg_request()
2190 rsp_seg = dma_map_sg(vhost->dev, job->reply_payload.sg_list, in ibmvfc_bsg_request()
2194 dma_unmap_sg(vhost->dev, job->request_payload.sg_list, in ibmvfc_bsg_request()
2196 mutex_unlock(&vhost->passthru_mutex); in ibmvfc_bsg_request()
2206 rc = ibmvfc_bsg_plogi(vhost, port_id); in ibmvfc_bsg_request()
2208 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_bsg_request()
2211 unlikely((rc = ibmvfc_host_chkready(vhost)))) { in ibmvfc_bsg_request()
2212 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_bsg_request()
2216 evt = ibmvfc_get_event(&vhost->crq); in ibmvfc_bsg_request()
2244 rc = ibmvfc_send_event(evt, vhost, 0); in ibmvfc_bsg_request()
2245 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_bsg_request()
2259 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_bsg_request()
2261 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_bsg_request()
2267 dma_unmap_sg(vhost->dev, job->request_payload.sg_list, in ibmvfc_bsg_request()
2269 dma_unmap_sg(vhost->dev, job->reply_payload.sg_list, in ibmvfc_bsg_request()
2271 mutex_unlock(&vhost->passthru_mutex); in ibmvfc_bsg_request()
2287 struct ibmvfc_host *vhost = shost_priv(sdev->host); in ibmvfc_reset_device() local
2293 struct ibmvfc_fcp_rsp *fc_rsp = ibmvfc_get_fcp_rsp(vhost, &rsp_iu.cmd); in ibmvfc_reset_device()
2298 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_reset_device()
2299 if (vhost->state == IBMVFC_ACTIVE) { in ibmvfc_reset_device()
2300 if (vhost->using_channels) in ibmvfc_reset_device()
2301 evt = ibmvfc_get_event(&vhost->scsi_scrqs.scrqs[0]); in ibmvfc_reset_device()
2303 evt = ibmvfc_get_event(&vhost->crq); in ibmvfc_reset_device()
2307 iu = ibmvfc_get_fcp_iu(vhost, tmf); in ibmvfc_reset_device()
2310 if (ibmvfc_check_caps(vhost, IBMVFC_HANDLE_VF_WWPN)) in ibmvfc_reset_device()
2316 rsp_rc = ibmvfc_send_event(evt, vhost, default_timeout); in ibmvfc_reset_device()
2318 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_reset_device()
2330 rsp_code = ibmvfc_get_err_result(vhost, &rsp_iu.cmd); in ibmvfc_reset_device()
2345 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_reset_device()
2347 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_reset_device()
2428 static int ibmvfc_wait_for_ops(struct ibmvfc_host *vhost, void *device, in ibmvfc_wait_for_ops() argument
2439 if (vhost->mq_enabled && vhost->using_channels) { in ibmvfc_wait_for_ops()
2440 queues = vhost->scsi_scrqs.scrqs; in ibmvfc_wait_for_ops()
2441 q_size = vhost->scsi_scrqs.active_queues; in ibmvfc_wait_for_ops()
2443 queues = &vhost->crq; in ibmvfc_wait_for_ops()
2449 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_wait_for_ops()
2463 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_wait_for_ops()
2470 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_wait_for_ops()
2484 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_wait_for_ops()
2486 dev_err(vhost->dev, "Timed out waiting for aborted commands\n"); in ibmvfc_wait_for_ops()
2501 struct ibmvfc_host *vhost = shost_priv(sdev->host); in ibmvfc_init_tmf() local
2512 if (ibmvfc_check_caps(vhost, IBMVFC_HANDLE_VF_WWPN)) { in ibmvfc_init_tmf()
2522 if (!ibmvfc_check_caps(vhost, IBMVFC_CAN_SUPPRESS_ABTS)) in ibmvfc_init_tmf()
2524 if (vhost->state == IBMVFC_ACTIVE) in ibmvfc_init_tmf()
2538 struct ibmvfc_host *vhost = shost_priv(sdev->host); in ibmvfc_cancel_all_mq() local
2540 struct ibmvfc_queue *queues = vhost->scsi_scrqs.scrqs; in ibmvfc_cancel_all_mq()
2548 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_cancel_all_mq()
2549 num_hwq = vhost->scsi_scrqs.active_queues; in ibmvfc_cancel_all_mq()
2562 if (found_evt && vhost->logged_in) { in ibmvfc_cancel_all_mq()
2565 ibmvfc_send_event(evt, vhost, default_timeout); in ibmvfc_cancel_all_mq()
2571 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_cancel_all_mq()
2574 if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL) in ibmvfc_cancel_all_mq()
2613 struct ibmvfc_host *vhost = shost_priv(sdev->host); in ibmvfc_cancel_all_sq() local
2622 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_cancel_all_sq()
2623 spin_lock(&vhost->crq.l_lock); in ibmvfc_cancel_all_sq()
2624 list_for_each_entry(evt, &vhost->crq.sent, queue_list) { in ibmvfc_cancel_all_sq()
2630 spin_unlock(&vhost->crq.l_lock); in ibmvfc_cancel_all_sq()
2633 if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL) in ibmvfc_cancel_all_sq()
2635 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_cancel_all_sq()
2639 if (vhost->logged_in) { in ibmvfc_cancel_all_sq()
2640 evt = ibmvfc_init_tmf(&vhost->crq, sdev, type); in ibmvfc_cancel_all_sq()
2642 rsp_rc = ibmvfc_send_event(evt, vhost, default_timeout); in ibmvfc_cancel_all_sq()
2645 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_cancel_all_sq()
2659 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_cancel_all_sq()
2661 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_cancel_all_sq()
2693 struct ibmvfc_host *vhost = shost_priv(sdev->host); in ibmvfc_cancel_all() local
2695 if (vhost->mq_enabled && vhost->using_channels) in ibmvfc_cancel_all()
2746 struct ibmvfc_host *vhost = shost_priv(sdev->host); in ibmvfc_abort_task_set() local
2752 struct ibmvfc_fcp_rsp *fc_rsp = ibmvfc_get_fcp_rsp(vhost, &rsp_iu.cmd); in ibmvfc_abort_task_set()
2758 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_abort_task_set()
2759 spin_lock(&vhost->crq.l_lock); in ibmvfc_abort_task_set()
2760 list_for_each_entry(evt, &vhost->crq.sent, queue_list) { in ibmvfc_abort_task_set()
2766 spin_unlock(&vhost->crq.l_lock); in ibmvfc_abort_task_set()
2769 if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL) in ibmvfc_abort_task_set()
2771 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_abort_task_set()
2775 if (vhost->state == IBMVFC_ACTIVE) { in ibmvfc_abort_task_set()
2776 evt = ibmvfc_get_event(&vhost->crq); in ibmvfc_abort_task_set()
2779 iu = ibmvfc_get_fcp_iu(vhost, tmf); in ibmvfc_abort_task_set()
2781 if (ibmvfc_check_caps(vhost, IBMVFC_HANDLE_VF_WWPN)) in ibmvfc_abort_task_set()
2790 rsp_rc = ibmvfc_send_event(evt, vhost, default_timeout); in ibmvfc_abort_task_set()
2793 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_abort_task_set()
2806 rc = ibmvfc_wait_for_ops(vhost, sdev->hostdata, ibmvfc_match_key); in ibmvfc_abort_task_set()
2813 ibmvfc_reset_host(vhost); in ibmvfc_abort_task_set()
2815 rc = ibmvfc_wait_for_ops(vhost, sdev->hostdata, ibmvfc_match_key); in ibmvfc_abort_task_set()
2820 rc = ibmvfc_wait_for_ops(vhost, evt, ibmvfc_match_evt); in ibmvfc_abort_task_set()
2822 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_abort_task_set()
2823 ibmvfc_hard_reset_host(vhost); in ibmvfc_abort_task_set()
2824 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_abort_task_set()
2833 rsp_code = ibmvfc_get_err_result(vhost, &rsp_iu.cmd); in ibmvfc_abort_task_set()
2849 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_abort_task_set()
2851 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_abort_task_set()
2865 struct ibmvfc_host *vhost = shost_priv(sdev->host); in ibmvfc_eh_abort_handler() local
2871 ibmvfc_wait_while_resetting(vhost); in ibmvfc_eh_abort_handler()
2879 rc = ibmvfc_wait_for_ops(vhost, sdev, ibmvfc_match_lun); in ibmvfc_eh_abort_handler()
2898 struct ibmvfc_host *vhost = shost_priv(sdev->host); in ibmvfc_eh_device_reset_handler() local
2904 ibmvfc_wait_while_resetting(vhost); in ibmvfc_eh_device_reset_handler()
2912 rc = ibmvfc_wait_for_ops(vhost, sdev, ibmvfc_match_lun); in ibmvfc_eh_device_reset_handler()
2955 struct ibmvfc_host *vhost = shost_priv(sdev->host); in ibmvfc_eh_target_reset_handler() local
2964 ibmvfc_wait_while_resetting(vhost); in ibmvfc_eh_target_reset_handler()
2972 rc = ibmvfc_wait_for_ops(vhost, starget, ibmvfc_match_target); in ibmvfc_eh_target_reset_handler()
2989 struct ibmvfc_host *vhost = shost_priv(cmd->device->host); in ibmvfc_eh_host_reset_handler() local
2991 dev_err(vhost->dev, "Resetting connection due to error recovery\n"); in ibmvfc_eh_host_reset_handler()
2992 rc = ibmvfc_issue_fc_host_lip(vhost->host); in ibmvfc_eh_host_reset_handler()
3007 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_terminate_rport_io() local
3022 rc = ibmvfc_wait_for_ops(vhost, rport, ibmvfc_match_rport); in ibmvfc_terminate_rport_io()
3029 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_terminate_rport_io()
3043 ibmvfc_reinit_host(vhost); in ibmvfc_terminate_rport_io()
3119 struct ibmvfc_host *vhost) in ibmvfc_handle_async() argument
3124 ibmvfc_log(vhost, desc->log_level, "%s event received. scsi_id: %llx, wwpn: %llx," in ibmvfc_handle_async()
3133 ibmvfc_link_down(vhost, IBMVFC_LINK_DOWN); in ibmvfc_handle_async()
3136 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_handle_async()
3141 vhost->events_to_log |= IBMVFC_AE_LINKUP; in ibmvfc_handle_async()
3142 vhost->delay_init = 1; in ibmvfc_handle_async()
3143 __ibmvfc_reset_host(vhost); in ibmvfc_handle_async()
3149 vhost->events_to_log |= IBMVFC_AE_LINKUP; in ibmvfc_handle_async()
3150 vhost->delay_init = 1; in ibmvfc_handle_async()
3151 __ibmvfc_reset_host(vhost); in ibmvfc_handle_async()
3155 vhost->events_to_log |= IBMVFC_AE_RSCN; in ibmvfc_handle_async()
3156 if (vhost->state < IBMVFC_HALTED) { in ibmvfc_handle_async()
3157 vhost->delay_init = 1; in ibmvfc_handle_async()
3158 __ibmvfc_reset_host(vhost); in ibmvfc_handle_async()
3163 vhost->events_to_log |= IBMVFC_AE_RSCN; in ibmvfc_handle_async()
3164 ibmvfc_reinit_host(vhost); in ibmvfc_handle_async()
3169 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_handle_async()
3182 ibmvfc_reinit_host(vhost); in ibmvfc_handle_async()
3188 ibmvfc_link_down(vhost, IBMVFC_LINK_DOWN); in ibmvfc_handle_async()
3191 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_handle_async()
3194 ibmvfc_link_down(vhost, IBMVFC_HALTED); in ibmvfc_handle_async()
3197 dev_err(vhost->dev, "Unknown async event received: %lld\n", crq->event); in ibmvfc_handle_async()
3209 static void ibmvfc_handle_crq(struct ibmvfc_crq *crq, struct ibmvfc_host *vhost, in ibmvfc_handle_crq() argument
3219 dev_info(vhost->dev, "Partner initialized\n"); in ibmvfc_handle_crq()
3221 rc = ibmvfc_send_crq_init_complete(vhost); in ibmvfc_handle_crq()
3223 ibmvfc_init_host(vhost); in ibmvfc_handle_crq()
3225 dev_err(vhost->dev, "Unable to send init rsp. rc=%ld\n", rc); in ibmvfc_handle_crq()
3228 dev_info(vhost->dev, "Partner initialization complete\n"); in ibmvfc_handle_crq()
3229 ibmvfc_init_host(vhost); in ibmvfc_handle_crq()
3232 dev_err(vhost->dev, "Unknown crq message type: %d\n", crq->format); in ibmvfc_handle_crq()
3236 vhost->state = IBMVFC_NO_CRQ; in ibmvfc_handle_crq()
3237 vhost->logged_in = 0; in ibmvfc_handle_crq()
3238 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE); in ibmvfc_handle_crq()
3241 dev_info(vhost->dev, "Partition migrated, Re-enabling adapter\n"); in ibmvfc_handle_crq()
3242 vhost->client_migrated = 1; in ibmvfc_handle_crq()
3244 scsi_block_requests(vhost->host); in ibmvfc_handle_crq()
3245 ibmvfc_purge_requests(vhost, DID_REQUEUE); in ibmvfc_handle_crq()
3246 ibmvfc_set_host_state(vhost, IBMVFC_LINK_DOWN); in ibmvfc_handle_crq()
3247 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_REENABLE); in ibmvfc_handle_crq()
3248 wake_up(&vhost->work_wait_q); in ibmvfc_handle_crq()
3250 dev_err(vhost->dev, "Host partner adapter deregistered or failed (rc=%d)\n", crq->format); in ibmvfc_handle_crq()
3251 ibmvfc_purge_requests(vhost, DID_ERROR); in ibmvfc_handle_crq()
3252 ibmvfc_link_down(vhost, IBMVFC_LINK_DOWN); in ibmvfc_handle_crq()
3253 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_RESET); in ibmvfc_handle_crq()
3255 dev_err(vhost->dev, "Received unknown transport event from partner (rc=%d)\n", crq->format); in ibmvfc_handle_crq()
3261 dev_err(vhost->dev, "Got an invalid message type 0x%02x\n", crq->valid); in ibmvfc_handle_crq()
3272 if (unlikely(!ibmvfc_valid_event(&vhost->crq.evt_pool, evt))) { in ibmvfc_handle_crq()
3273 dev_err(vhost->dev, "Returned correlation_token 0x%08llx is invalid!\n", in ibmvfc_handle_crq()
3279 dev_err(vhost->dev, "Received duplicate correlation_token 0x%08llx!\n", in ibmvfc_handle_crq()
3300 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_scan_finished() local
3304 if (!vhost->scan_timeout) in ibmvfc_scan_finished()
3306 else if (time >= (vhost->scan_timeout * HZ)) { in ibmvfc_scan_finished()
3307 dev_info(vhost->dev, "Scan taking longer than %d seconds, " in ibmvfc_scan_finished()
3308 "continuing initialization\n", vhost->scan_timeout); in ibmvfc_scan_finished()
3312 if (vhost->scan_complete) { in ibmvfc_scan_finished()
3313 vhost->scan_timeout = init_timeout; in ibmvfc_scan_finished()
3334 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_slave_alloc() local
3341 sdev->hostdata = (void *)(unsigned long)vhost->task_set++; in ibmvfc_slave_alloc()
3359 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_target_alloc() local
3363 starget->hostdata = (void *)(unsigned long)vhost->task_set++; in ibmvfc_target_alloc()
3412 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_show_host_partition_name() local
3415 vhost->login_buf->resp.partition_name); in ibmvfc_show_host_partition_name()
3422 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_show_host_device_name() local
3425 vhost->login_buf->resp.device_name); in ibmvfc_show_host_device_name()
3432 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_show_host_loc_code() local
3435 vhost->login_buf->resp.port_loc_code); in ibmvfc_show_host_loc_code()
3442 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_show_host_drc_name() local
3445 vhost->login_buf->resp.drc_name); in ibmvfc_show_host_drc_name()
3452 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_show_host_npiv_version() local
3453 return snprintf(buf, PAGE_SIZE, "%d\n", be32_to_cpu(vhost->login_buf->resp.version)); in ibmvfc_show_host_npiv_version()
3460 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_show_host_capabilities() local
3461 return snprintf(buf, PAGE_SIZE, "%llx\n", be64_to_cpu(vhost->login_buf->resp.capabilities)); in ibmvfc_show_host_capabilities()
3477 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_show_log_level() local
3482 len = snprintf(buf, PAGE_SIZE, "%d\n", vhost->log_level); in ibmvfc_show_log_level()
3502 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_store_log_level() local
3506 vhost->log_level = simple_strtoul(buf, NULL, 10); in ibmvfc_store_log_level()
3515 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_show_scsi_channels() local
3520 len = snprintf(buf, PAGE_SIZE, "%d\n", vhost->client_scsi_channels); in ibmvfc_show_scsi_channels()
3530 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_store_scsi_channels() local
3536 vhost->client_scsi_channels = min(channels, nr_scsi_hw_queues); in ibmvfc_store_scsi_channels()
3537 ibmvfc_hard_reset_host(vhost); in ibmvfc_store_scsi_channels()
3572 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_read_trace() local
3575 char *src = (char *)vhost->trace; in ibmvfc_read_trace()
3646 static struct ibmvfc_async_crq *ibmvfc_next_async_crq(struct ibmvfc_host *vhost) in ibmvfc_next_async_crq() argument
3648 struct ibmvfc_queue *async_crq = &vhost->async_crq; in ibmvfc_next_async_crq()
3669 static struct ibmvfc_crq *ibmvfc_next_crq(struct ibmvfc_host *vhost) in ibmvfc_next_crq() argument
3671 struct ibmvfc_queue *queue = &vhost->crq; in ibmvfc_next_crq()
3695 struct ibmvfc_host *vhost = (struct ibmvfc_host *)dev_instance; in ibmvfc_interrupt() local
3698 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_interrupt()
3699 vio_disable_interrupts(to_vio_dev(vhost->dev)); in ibmvfc_interrupt()
3700 tasklet_schedule(&vhost->tasklet); in ibmvfc_interrupt()
3701 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_interrupt()
3714 struct ibmvfc_host *vhost = data; in ibmvfc_tasklet() local
3715 struct vio_dev *vdev = to_vio_dev(vhost->dev); in ibmvfc_tasklet()
3723 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_tasklet()
3724 spin_lock(vhost->crq.q_lock); in ibmvfc_tasklet()
3727 while ((async = ibmvfc_next_async_crq(vhost)) != NULL) { in ibmvfc_tasklet()
3728 ibmvfc_handle_async(async, vhost); in ibmvfc_tasklet()
3734 while ((crq = ibmvfc_next_crq(vhost)) != NULL) { in ibmvfc_tasklet()
3735 ibmvfc_handle_crq(crq, vhost, &evt_doneq); in ibmvfc_tasklet()
3741 if ((async = ibmvfc_next_async_crq(vhost)) != NULL) { in ibmvfc_tasklet()
3743 ibmvfc_handle_async(async, vhost); in ibmvfc_tasklet()
3746 } else if ((crq = ibmvfc_next_crq(vhost)) != NULL) { in ibmvfc_tasklet()
3748 ibmvfc_handle_crq(crq, vhost, &evt_doneq); in ibmvfc_tasklet()
3755 spin_unlock(vhost->crq.q_lock); in ibmvfc_tasklet()
3756 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_tasklet()
3768 struct device *dev = scrq->vhost->dev; in ibmvfc_toggle_scrq_irq()
3786 static void ibmvfc_handle_scrq(struct ibmvfc_crq *crq, struct ibmvfc_host *vhost, in ibmvfc_handle_scrq() argument
3797 dev_err(vhost->dev, "Got and invalid message type 0x%02x\n", crq->valid); in ibmvfc_handle_scrq()
3806 dev_err(vhost->dev, "Returned correlation_token 0x%08llx is invalid!\n", in ibmvfc_handle_scrq()
3812 dev_err(vhost->dev, "Received duplicate correlation_token 0x%08llx!\n", in ibmvfc_handle_scrq()
3848 ibmvfc_handle_scrq(crq, scrq->vhost, &evt_doneq); in ibmvfc_drain_sub_crq()
3856 ibmvfc_handle_scrq(crq, scrq->vhost, &evt_doneq); in ibmvfc_drain_sub_crq()
3893 wake_up(&tgt->vhost->work_wait_q); in ibmvfc_init_tgt()
3909 wake_up(&tgt->vhost->work_wait_q); in ibmvfc_retry_tgt_init()
3958 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_prli_done() local
3964 vhost->discovery_threads--; in ibmvfc_tgt_prli_done()
4016 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_prli_done()
4027 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_send_prli() local
4030 if (vhost->discovery_threads >= disc_threads) in ibmvfc_tgt_send_prli()
4034 evt = ibmvfc_get_event(&vhost->crq); in ibmvfc_tgt_send_prli()
4035 vhost->discovery_threads++; in ibmvfc_tgt_send_prli()
4040 if (ibmvfc_check_caps(vhost, IBMVFC_HANDLE_VF_WWPN)) { in ibmvfc_tgt_send_prli()
4059 if (ibmvfc_send_event(evt, vhost, default_timeout)) { in ibmvfc_tgt_send_prli()
4060 vhost->discovery_threads--; in ibmvfc_tgt_send_prli()
4075 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_plogi_done() local
4080 vhost->discovery_threads--; in ibmvfc_tgt_plogi_done()
4087 vhost->reinit = 1; in ibmvfc_tgt_plogi_done()
4122 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_plogi_done()
4133 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_send_plogi() local
4136 if (vhost->discovery_threads >= disc_threads) in ibmvfc_tgt_send_plogi()
4141 evt = ibmvfc_get_event(&vhost->crq); in ibmvfc_tgt_send_plogi()
4142 vhost->discovery_threads++; in ibmvfc_tgt_send_plogi()
4148 if (ibmvfc_check_caps(vhost, IBMVFC_HANDLE_VF_WWPN)) { in ibmvfc_tgt_send_plogi()
4158 if (ibmvfc_send_event(evt, vhost, default_timeout)) { in ibmvfc_tgt_send_plogi()
4159 vhost->discovery_threads--; in ibmvfc_tgt_send_plogi()
4174 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_implicit_logout_done() local
4178 vhost->discovery_threads--; in ibmvfc_tgt_implicit_logout_done()
4188 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_implicit_logout_done()
4198 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_implicit_logout_done()
4213 struct ibmvfc_host *vhost = tgt->vhost; in __ibmvfc_tgt_get_implicit_logout_evt() local
4217 evt = ibmvfc_get_event(&vhost->crq); in __ibmvfc_tgt_get_implicit_logout_evt()
4236 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_implicit_logout() local
4239 if (vhost->discovery_threads >= disc_threads) in ibmvfc_tgt_implicit_logout()
4242 vhost->discovery_threads++; in ibmvfc_tgt_implicit_logout()
4247 if (ibmvfc_send_event(evt, vhost, default_timeout)) { in ibmvfc_tgt_implicit_logout()
4248 vhost->discovery_threads--; in ibmvfc_tgt_implicit_logout()
4263 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_implicit_logout_and_del_done() local
4267 vhost->discovery_threads--; in ibmvfc_tgt_implicit_logout_and_del_done()
4277 if (status == IBMVFC_MAD_SUCCESS || vhost->state == IBMVFC_HOST_OFFLINE) in ibmvfc_tgt_implicit_logout_and_del_done()
4284 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_implicit_logout_and_del_done()
4294 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_implicit_logout_and_del() local
4297 if (!vhost->logged_in) { in ibmvfc_tgt_implicit_logout_and_del()
4302 if (vhost->discovery_threads >= disc_threads) in ibmvfc_tgt_implicit_logout_and_del()
4305 vhost->discovery_threads++; in ibmvfc_tgt_implicit_logout_and_del()
4310 if (ibmvfc_send_event(evt, vhost, default_timeout)) { in ibmvfc_tgt_implicit_logout_and_del()
4311 vhost->discovery_threads--; in ibmvfc_tgt_implicit_logout_and_del()
4326 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_move_login_done() local
4331 vhost->discovery_threads--; in ibmvfc_tgt_move_login_done()
4364 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_move_login_done()
4375 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_move_login() local
4379 if (vhost->discovery_threads >= disc_threads) in ibmvfc_tgt_move_login()
4383 evt = ibmvfc_get_event(&vhost->crq); in ibmvfc_tgt_move_login()
4384 vhost->discovery_threads++; in ibmvfc_tgt_move_login()
4399 if (ibmvfc_send_event(evt, vhost, default_timeout)) { in ibmvfc_tgt_move_login()
4400 vhost->discovery_threads--; in ibmvfc_tgt_move_login()
4435 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_adisc_done() local
4440 vhost->discovery_threads--; in ibmvfc_tgt_adisc_done()
4467 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_adisc_done()
4510 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_adisc_cancel_done() local
4514 vhost->abort_threads--; in ibmvfc_tgt_adisc_cancel_done()
4517 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_adisc_cancel_done()
4531 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_adisc_timeout() local
4538 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_adisc_timeout()
4539 if (vhost->abort_threads >= disc_threads || in ibmvfc_adisc_timeout()
4541 vhost->state != IBMVFC_INITIALIZING || in ibmvfc_adisc_timeout()
4542 vhost->action != IBMVFC_HOST_ACTION_QUERY_TGTS) { in ibmvfc_adisc_timeout()
4543 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_adisc_timeout()
4547 vhost->abort_threads++; in ibmvfc_adisc_timeout()
4549 evt = ibmvfc_get_event(&vhost->crq); in ibmvfc_adisc_timeout()
4555 if (ibmvfc_check_caps(vhost, IBMVFC_HANDLE_VF_WWPN)) { in ibmvfc_adisc_timeout()
4566 rc = ibmvfc_send_event(evt, vhost, default_timeout); in ibmvfc_adisc_timeout()
4570 vhost->abort_threads--; in ibmvfc_adisc_timeout()
4572 __ibmvfc_reset_host(vhost); in ibmvfc_adisc_timeout()
4575 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_adisc_timeout()
4592 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_adisc() local
4595 if (vhost->discovery_threads >= disc_threads) in ibmvfc_tgt_adisc()
4599 evt = ibmvfc_get_event(&vhost->crq); in ibmvfc_tgt_adisc()
4600 vhost->discovery_threads++; in ibmvfc_tgt_adisc()
4611 memcpy(&mad->fc_iu.payload[2], &vhost->login_buf->resp.port_name, in ibmvfc_tgt_adisc()
4612 sizeof(vhost->login_buf->resp.port_name)); in ibmvfc_tgt_adisc()
4613 memcpy(&mad->fc_iu.payload[4], &vhost->login_buf->resp.node_name, in ibmvfc_tgt_adisc()
4614 sizeof(vhost->login_buf->resp.node_name)); in ibmvfc_tgt_adisc()
4615 mad->fc_iu.payload[6] = cpu_to_be32(be64_to_cpu(vhost->login_buf->resp.scsi_id) & 0x00ffffff); in ibmvfc_tgt_adisc()
4625 if (ibmvfc_send_event(evt, vhost, IBMVFC_ADISC_PLUS_CANCEL_TIMEOUT)) { in ibmvfc_tgt_adisc()
4626 vhost->discovery_threads--; in ibmvfc_tgt_adisc()
4642 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_query_target_done() local
4647 vhost->discovery_threads--; in ibmvfc_tgt_query_target_done()
4684 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_query_target_done()
4695 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_query_target() local
4698 if (vhost->discovery_threads >= disc_threads) in ibmvfc_tgt_query_target()
4702 evt = ibmvfc_get_event(&vhost->crq); in ibmvfc_tgt_query_target()
4703 vhost->discovery_threads++; in ibmvfc_tgt_query_target()
4714 if (ibmvfc_send_event(evt, vhost, default_timeout)) { in ibmvfc_tgt_query_target()
4715 vhost->discovery_threads--; in ibmvfc_tgt_query_target()
4730 static int ibmvfc_alloc_target(struct ibmvfc_host *vhost, in ibmvfc_alloc_target() argument
4741 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_alloc_target()
4742 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_alloc_target()
4749 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_alloc_target()
4793 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_alloc_target()
4795 tgt = mempool_alloc(vhost->tgt_pool, GFP_NOIO); in ibmvfc_alloc_target()
4799 tgt->vhost = vhost; in ibmvfc_alloc_target()
4804 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_alloc_target()
4805 tgt->cancel_key = vhost->task_set++; in ibmvfc_alloc_target()
4806 list_add_tail(&tgt->queue, &vhost->targets); in ibmvfc_alloc_target()
4809 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_alloc_target()
4820 static int ibmvfc_alloc_targets(struct ibmvfc_host *vhost) in ibmvfc_alloc_targets() argument
4824 for (i = 0, rc = 0; !rc && i < vhost->num_targets; i++) in ibmvfc_alloc_targets()
4825 rc = ibmvfc_alloc_target(vhost, &vhost->disc_buf[i]); in ibmvfc_alloc_targets()
4837 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_discover_targets_done() local
4844 ibmvfc_dbg(vhost, "Discover Targets succeeded\n"); in ibmvfc_discover_targets_done()
4845 vhost->num_targets = be32_to_cpu(rsp->num_written); in ibmvfc_discover_targets_done()
4846 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_ALLOC_TGTS); in ibmvfc_discover_targets_done()
4849 level += ibmvfc_retry_host_init(vhost); in ibmvfc_discover_targets_done()
4850 ibmvfc_log(vhost, level, "Discover Targets failed: %s (%x:%x)\n", in ibmvfc_discover_targets_done()
4857 dev_err(vhost->dev, "Invalid Discover Targets response: 0x%x\n", mad_status); in ibmvfc_discover_targets_done()
4858 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_discover_targets_done()
4863 wake_up(&vhost->work_wait_q); in ibmvfc_discover_targets_done()
4871 static void ibmvfc_discover_targets(struct ibmvfc_host *vhost) in ibmvfc_discover_targets() argument
4874 struct ibmvfc_event *evt = ibmvfc_get_event(&vhost->crq); in ibmvfc_discover_targets()
4882 mad->bufflen = cpu_to_be32(vhost->disc_buf_sz); in ibmvfc_discover_targets()
4883 mad->buffer.va = cpu_to_be64(vhost->disc_buf_dma); in ibmvfc_discover_targets()
4884 mad->buffer.len = cpu_to_be32(vhost->disc_buf_sz); in ibmvfc_discover_targets()
4886 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT_WAIT); in ibmvfc_discover_targets()
4888 if (!ibmvfc_send_event(evt, vhost, default_timeout)) in ibmvfc_discover_targets()
4889 ibmvfc_dbg(vhost, "Sent discover targets\n"); in ibmvfc_discover_targets()
4891 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_discover_targets()
4896 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_channel_setup_done() local
4897 struct ibmvfc_channel_setup *setup = vhost->channel_setup_buf; in ibmvfc_channel_setup_done()
4898 struct ibmvfc_scsi_channels *scrqs = &vhost->scsi_scrqs; in ibmvfc_channel_setup_done()
4907 ibmvfc_dbg(vhost, "Channel Setup succeeded\n"); in ibmvfc_channel_setup_done()
4909 vhost->do_enquiry = 0; in ibmvfc_channel_setup_done()
4914 ibmvfc_dbg(vhost, "Channels Canceled\n"); in ibmvfc_channel_setup_done()
4915 vhost->using_channels = 0; in ibmvfc_channel_setup_done()
4918 vhost->using_channels = 1; in ibmvfc_channel_setup_done()
4923 ibmvfc_dbg(vhost, "Using %u channels\n", in ibmvfc_channel_setup_done()
4924 vhost->scsi_scrqs.active_queues); in ibmvfc_channel_setup_done()
4928 level += ibmvfc_retry_host_init(vhost); in ibmvfc_channel_setup_done()
4929 ibmvfc_log(vhost, level, "Channel Setup failed\n"); in ibmvfc_channel_setup_done()
4934 dev_err(vhost->dev, "Invalid Channel Setup response: 0x%x\n", in ibmvfc_channel_setup_done()
4936 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_channel_setup_done()
4940 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY); in ibmvfc_channel_setup_done()
4941 wake_up(&vhost->work_wait_q); in ibmvfc_channel_setup_done()
4944 static void ibmvfc_channel_setup(struct ibmvfc_host *vhost) in ibmvfc_channel_setup() argument
4947 struct ibmvfc_channel_setup *setup_buf = vhost->channel_setup_buf; in ibmvfc_channel_setup()
4948 struct ibmvfc_event *evt = ibmvfc_get_event(&vhost->crq); in ibmvfc_channel_setup()
4949 struct ibmvfc_scsi_channels *scrqs = &vhost->scsi_scrqs; in ibmvfc_channel_setup()
4951 min(vhost->client_scsi_channels, vhost->max_vios_scsi_channels); in ibmvfc_channel_setup()
4969 mad->buffer.va = cpu_to_be64(vhost->channel_setup_dma); in ibmvfc_channel_setup()
4970 mad->buffer.len = cpu_to_be32(sizeof(*vhost->channel_setup_buf)); in ibmvfc_channel_setup()
4972 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT_WAIT); in ibmvfc_channel_setup()
4974 if (!ibmvfc_send_event(evt, vhost, default_timeout)) in ibmvfc_channel_setup()
4975 ibmvfc_dbg(vhost, "Sent channel setup\n"); in ibmvfc_channel_setup()
4977 ibmvfc_link_down(vhost, IBMVFC_LINK_DOWN); in ibmvfc_channel_setup()
4982 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_channel_enquiry_done() local
4989 ibmvfc_dbg(vhost, "Channel Enquiry succeeded\n"); in ibmvfc_channel_enquiry_done()
4990 vhost->max_vios_scsi_channels = be32_to_cpu(rsp->num_scsi_subq_channels); in ibmvfc_channel_enquiry_done()
4994 level += ibmvfc_retry_host_init(vhost); in ibmvfc_channel_enquiry_done()
4995 ibmvfc_log(vhost, level, "Channel Enquiry failed\n"); in ibmvfc_channel_enquiry_done()
5001 dev_err(vhost->dev, "Invalid Channel Enquiry response: 0x%x\n", in ibmvfc_channel_enquiry_done()
5003 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_channel_enquiry_done()
5008 ibmvfc_channel_setup(vhost); in ibmvfc_channel_enquiry_done()
5011 static void ibmvfc_channel_enquiry(struct ibmvfc_host *vhost) in ibmvfc_channel_enquiry() argument
5014 struct ibmvfc_event *evt = ibmvfc_get_event(&vhost->crq); in ibmvfc_channel_enquiry()
5028 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT_WAIT); in ibmvfc_channel_enquiry()
5030 if (!ibmvfc_send_event(evt, vhost, default_timeout)) in ibmvfc_channel_enquiry()
5031 ibmvfc_dbg(vhost, "Send channel enquiry\n"); in ibmvfc_channel_enquiry()
5033 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_channel_enquiry()
5043 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_npiv_login_done() local
5045 struct ibmvfc_npiv_login_resp *rsp = &vhost->login_buf->resp; in ibmvfc_npiv_login_done()
5055 level += ibmvfc_retry_host_init(vhost); in ibmvfc_npiv_login_done()
5057 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_npiv_login_done()
5058 ibmvfc_log(vhost, level, "NPIV Login failed: %s (%x:%x)\n", in ibmvfc_npiv_login_done()
5064 ibmvfc_retry_host_init(vhost); in ibmvfc_npiv_login_done()
5070 dev_err(vhost->dev, "Invalid NPIV Login response: 0x%x\n", mad_status); in ibmvfc_npiv_login_done()
5071 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_npiv_login_done()
5076 vhost->client_migrated = 0; in ibmvfc_npiv_login_done()
5079 dev_err(vhost->dev, "Virtual adapter does not support FC. %x\n", in ibmvfc_npiv_login_done()
5081 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_npiv_login_done()
5082 wake_up(&vhost->work_wait_q); in ibmvfc_npiv_login_done()
5087 dev_err(vhost->dev, "Virtual adapter supported queue depth too small: %d\n", in ibmvfc_npiv_login_done()
5089 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_npiv_login_done()
5090 wake_up(&vhost->work_wait_q); in ibmvfc_npiv_login_done()
5094 vhost->logged_in = 1; in ibmvfc_npiv_login_done()
5096 dev_info(vhost->dev, "Host partition: %s, device: %s %s %s max sectors %u\n", in ibmvfc_npiv_login_done()
5100 fc_host_fabric_name(vhost->host) = be64_to_cpu(rsp->node_name); in ibmvfc_npiv_login_done()
5101 fc_host_node_name(vhost->host) = be64_to_cpu(rsp->node_name); in ibmvfc_npiv_login_done()
5102 fc_host_port_name(vhost->host) = be64_to_cpu(rsp->port_name); in ibmvfc_npiv_login_done()
5103 fc_host_port_id(vhost->host) = be64_to_cpu(rsp->scsi_id); in ibmvfc_npiv_login_done()
5104 fc_host_port_type(vhost->host) = FC_PORTTYPE_NPIV; in ibmvfc_npiv_login_done()
5105 fc_host_supported_classes(vhost->host) = 0; in ibmvfc_npiv_login_done()
5107 fc_host_supported_classes(vhost->host) |= FC_COS_CLASS1; in ibmvfc_npiv_login_done()
5109 fc_host_supported_classes(vhost->host) |= FC_COS_CLASS2; in ibmvfc_npiv_login_done()
5111 fc_host_supported_classes(vhost->host) |= FC_COS_CLASS3; in ibmvfc_npiv_login_done()
5112 fc_host_maxframe_size(vhost->host) = in ibmvfc_npiv_login_done()
5115 vhost->host->can_queue = be32_to_cpu(rsp->max_cmds) - IBMVFC_NUM_INTERNAL_REQ; in ibmvfc_npiv_login_done()
5116 vhost->host->max_sectors = npiv_max_sectors; in ibmvfc_npiv_login_done()
5118 if (ibmvfc_check_caps(vhost, IBMVFC_CAN_SUPPORT_CHANNELS) && vhost->do_enquiry) { in ibmvfc_npiv_login_done()
5119 ibmvfc_channel_enquiry(vhost); in ibmvfc_npiv_login_done()
5121 vhost->do_enquiry = 0; in ibmvfc_npiv_login_done()
5122 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY); in ibmvfc_npiv_login_done()
5123 wake_up(&vhost->work_wait_q); in ibmvfc_npiv_login_done()
5132 static void ibmvfc_npiv_login(struct ibmvfc_host *vhost) in ibmvfc_npiv_login() argument
5135 struct ibmvfc_event *evt = ibmvfc_get_event(&vhost->crq); in ibmvfc_npiv_login()
5137 ibmvfc_gather_partition_info(vhost); in ibmvfc_npiv_login()
5138 ibmvfc_set_login_info(vhost); in ibmvfc_npiv_login()
5141 memcpy(vhost->login_buf, &vhost->login_info, sizeof(vhost->login_info)); in ibmvfc_npiv_login()
5147 mad->buffer.va = cpu_to_be64(vhost->login_buf_dma); in ibmvfc_npiv_login()
5148 mad->buffer.len = cpu_to_be32(sizeof(*vhost->login_buf)); in ibmvfc_npiv_login()
5150 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT_WAIT); in ibmvfc_npiv_login()
5152 if (!ibmvfc_send_event(evt, vhost, default_timeout)) in ibmvfc_npiv_login()
5153 ibmvfc_dbg(vhost, "Sent NPIV login\n"); in ibmvfc_npiv_login()
5155 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_npiv_login()
5165 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_npiv_logout_done() local
5172 if (list_empty(&vhost->crq.sent) && in ibmvfc_npiv_logout_done()
5173 vhost->action == IBMVFC_HOST_ACTION_LOGO_WAIT) { in ibmvfc_npiv_logout_done()
5174 ibmvfc_init_host(vhost); in ibmvfc_npiv_logout_done()
5183 ibmvfc_dbg(vhost, "NPIV Logout failed. 0x%X\n", mad_status); in ibmvfc_npiv_logout_done()
5187 ibmvfc_hard_reset_host(vhost); in ibmvfc_npiv_logout_done()
5195 static void ibmvfc_npiv_logout(struct ibmvfc_host *vhost) in ibmvfc_npiv_logout() argument
5200 evt = ibmvfc_get_event(&vhost->crq); in ibmvfc_npiv_logout()
5209 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_LOGO_WAIT); in ibmvfc_npiv_logout()
5211 if (!ibmvfc_send_event(evt, vhost, default_timeout)) in ibmvfc_npiv_logout()
5212 ibmvfc_dbg(vhost, "Sent NPIV logout\n"); in ibmvfc_npiv_logout()
5214 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_npiv_logout()
5224 static int ibmvfc_dev_init_to_do(struct ibmvfc_host *vhost) in ibmvfc_dev_init_to_do() argument
5228 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_dev_init_to_do()
5244 static int ibmvfc_dev_logo_to_do(struct ibmvfc_host *vhost) in ibmvfc_dev_logo_to_do() argument
5248 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_dev_logo_to_do()
5263 static int __ibmvfc_work_to_do(struct ibmvfc_host *vhost) in __ibmvfc_work_to_do() argument
5269 switch (vhost->action) { in __ibmvfc_work_to_do()
5276 if (vhost->discovery_threads == disc_threads) in __ibmvfc_work_to_do()
5278 list_for_each_entry(tgt, &vhost->targets, queue) in __ibmvfc_work_to_do()
5281 list_for_each_entry(tgt, &vhost->targets, queue) in __ibmvfc_work_to_do()
5287 if (vhost->discovery_threads == disc_threads) in __ibmvfc_work_to_do()
5289 list_for_each_entry(tgt, &vhost->targets, queue) in __ibmvfc_work_to_do()
5292 list_for_each_entry(tgt, &vhost->targets, queue) in __ibmvfc_work_to_do()
5316 static int ibmvfc_work_to_do(struct ibmvfc_host *vhost) in ibmvfc_work_to_do() argument
5321 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_work_to_do()
5322 rc = __ibmvfc_work_to_do(vhost); in ibmvfc_work_to_do()
5323 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_work_to_do()
5333 static void ibmvfc_log_ae(struct ibmvfc_host *vhost, int events) in ibmvfc_log_ae() argument
5336 fc_host_post_event(vhost->host, fc_get_event_number(), FCH_EVT_RSCN, 0); in ibmvfc_log_ae()
5338 vhost->state >= IBMVFC_HALTED) in ibmvfc_log_ae()
5339 fc_host_post_event(vhost->host, fc_get_event_number(), FCH_EVT_LINKDOWN, 0); in ibmvfc_log_ae()
5341 vhost->state == IBMVFC_INITIALIZING) in ibmvfc_log_ae()
5342 fc_host_post_event(vhost->host, fc_get_event_number(), FCH_EVT_LINKUP, 0); in ibmvfc_log_ae()
5352 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_add_rport() local
5357 rport = fc_remote_port_add(vhost->host, 0, &tgt->ids); in ibmvfc_tgt_add_rport()
5358 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_tgt_add_rport()
5364 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_tgt_add_rport()
5374 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_tgt_add_rport()
5378 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_tgt_add_rport()
5398 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_tgt_add_rport()
5406 static void ibmvfc_do_work(struct ibmvfc_host *vhost) in ibmvfc_do_work() argument
5414 ibmvfc_log_ae(vhost, vhost->events_to_log); in ibmvfc_do_work()
5415 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_do_work()
5416 vhost->events_to_log = 0; in ibmvfc_do_work()
5417 switch (vhost->action) { in ibmvfc_do_work()
5423 list_splice_init(&vhost->purge, &purge); in ibmvfc_do_work()
5424 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
5426 rc = ibmvfc_reset_crq(vhost); in ibmvfc_do_work()
5428 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_do_work()
5430 vio_enable_interrupts(to_vio_dev(vhost->dev)); in ibmvfc_do_work()
5431 if (vhost->action == IBMVFC_HOST_ACTION_RESET) { in ibmvfc_do_work()
5438 vhost->action = IBMVFC_HOST_ACTION_TGT_DEL; in ibmvfc_do_work()
5440 if (rc || (rc = ibmvfc_send_crq_init(vhost)) || in ibmvfc_do_work()
5441 (rc = vio_enable_interrupts(to_vio_dev(vhost->dev)))) { in ibmvfc_do_work()
5442 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_do_work()
5443 dev_err(vhost->dev, "Error after reset (rc=%d)\n", rc); in ibmvfc_do_work()
5448 list_splice_init(&vhost->purge, &purge); in ibmvfc_do_work()
5449 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
5451 rc = ibmvfc_reenable_crq_queue(vhost); in ibmvfc_do_work()
5453 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_do_work()
5454 if (vhost->action == IBMVFC_HOST_ACTION_REENABLE) { in ibmvfc_do_work()
5461 vhost->action = IBMVFC_HOST_ACTION_TGT_DEL; in ibmvfc_do_work()
5462 if (rc || (rc = ibmvfc_send_crq_init(vhost))) { in ibmvfc_do_work()
5463 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_do_work()
5464 dev_err(vhost->dev, "Error after enable (rc=%d)\n", rc); in ibmvfc_do_work()
5469 vhost->job_step(vhost); in ibmvfc_do_work()
5472 BUG_ON(vhost->state != IBMVFC_INITIALIZING); in ibmvfc_do_work()
5473 if (vhost->delay_init) { in ibmvfc_do_work()
5474 vhost->delay_init = 0; in ibmvfc_do_work()
5475 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
5479 vhost->job_step(vhost); in ibmvfc_do_work()
5482 list_for_each_entry(tgt, &vhost->targets, queue) in ibmvfc_do_work()
5484 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY_TGTS); in ibmvfc_do_work()
5487 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_do_work()
5494 if (!ibmvfc_dev_init_to_do(vhost)) in ibmvfc_do_work()
5495 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_DEL); in ibmvfc_do_work()
5499 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_do_work()
5506 if (ibmvfc_dev_logo_to_do(vhost)) { in ibmvfc_do_work()
5507 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
5511 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_do_work()
5518 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
5542 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
5549 if (vhost->state == IBMVFC_INITIALIZING) { in ibmvfc_do_work()
5550 if (vhost->action == IBMVFC_HOST_ACTION_TGT_DEL_FAILED) { in ibmvfc_do_work()
5551 if (vhost->reinit) { in ibmvfc_do_work()
5552 vhost->reinit = 0; in ibmvfc_do_work()
5553 scsi_block_requests(vhost->host); in ibmvfc_do_work()
5554 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY); in ibmvfc_do_work()
5555 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
5557 ibmvfc_set_host_state(vhost, IBMVFC_ACTIVE); in ibmvfc_do_work()
5558 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE); in ibmvfc_do_work()
5559 wake_up(&vhost->init_wait_q); in ibmvfc_do_work()
5560 schedule_work(&vhost->rport_add_work_q); in ibmvfc_do_work()
5561 vhost->init_retries = 0; in ibmvfc_do_work()
5562 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
5563 scsi_unblock_requests(vhost->host); in ibmvfc_do_work()
5568 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT); in ibmvfc_do_work()
5569 vhost->job_step = ibmvfc_discover_targets; in ibmvfc_do_work()
5572 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE); in ibmvfc_do_work()
5573 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
5574 scsi_unblock_requests(vhost->host); in ibmvfc_do_work()
5575 wake_up(&vhost->init_wait_q); in ibmvfc_do_work()
5580 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_INIT); in ibmvfc_do_work()
5581 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
5582 ibmvfc_alloc_targets(vhost); in ibmvfc_do_work()
5583 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_do_work()
5586 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_do_work()
5593 if (!ibmvfc_dev_init_to_do(vhost)) in ibmvfc_do_work()
5594 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_DEL_FAILED); in ibmvfc_do_work()
5600 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
5612 struct ibmvfc_host *vhost = data; in ibmvfc_work() local
5618 rc = wait_event_interruptible(vhost->work_wait_q, in ibmvfc_work()
5619 ibmvfc_work_to_do(vhost)); in ibmvfc_work()
5626 ibmvfc_do_work(vhost); in ibmvfc_work()
5629 ibmvfc_dbg(vhost, "ibmvfc kthread exiting...\n"); in ibmvfc_work()
5642 static int ibmvfc_alloc_queue(struct ibmvfc_host *vhost, in ibmvfc_alloc_queue() argument
5646 struct device *dev = vhost->dev; in ibmvfc_alloc_queue()
5672 if (ibmvfc_init_event_pool(vhost, queue, pool_size)) { in ibmvfc_alloc_queue()
5694 queue->vhost = vhost; in ibmvfc_alloc_queue()
5708 static int ibmvfc_init_crq(struct ibmvfc_host *vhost) in ibmvfc_init_crq() argument
5711 struct device *dev = vhost->dev; in ibmvfc_init_crq()
5713 struct ibmvfc_queue *crq = &vhost->crq; in ibmvfc_init_crq()
5716 if (ibmvfc_alloc_queue(vhost, crq, IBMVFC_CRQ_FMT)) in ibmvfc_init_crq()
5724 retrc = rc = ibmvfc_reset_crq(vhost); in ibmvfc_init_crq()
5735 tasklet_init(&vhost->tasklet, (void *)ibmvfc_tasklet, (unsigned long)vhost); in ibmvfc_init_crq()
5737 if ((rc = request_irq(vdev->irq, ibmvfc_interrupt, 0, IBMVFC_NAME, vhost))) { in ibmvfc_init_crq()
5751 tasklet_kill(&vhost->tasklet); in ibmvfc_init_crq()
5756 ibmvfc_free_queue(vhost, crq); in ibmvfc_init_crq()
5760 static int ibmvfc_register_scsi_channel(struct ibmvfc_host *vhost, in ibmvfc_register_scsi_channel() argument
5763 struct device *dev = vhost->dev; in ibmvfc_register_scsi_channel()
5765 struct ibmvfc_queue *scrq = &vhost->scsi_scrqs.scrqs[index]; in ibmvfc_register_scsi_channel()
5813 static void ibmvfc_deregister_scsi_channel(struct ibmvfc_host *vhost, int index) in ibmvfc_deregister_scsi_channel() argument
5815 struct device *dev = vhost->dev; in ibmvfc_deregister_scsi_channel()
5817 struct ibmvfc_queue *scrq = &vhost->scsi_scrqs.scrqs[index]; in ibmvfc_deregister_scsi_channel()
5841 static void ibmvfc_reg_sub_crqs(struct ibmvfc_host *vhost) in ibmvfc_reg_sub_crqs() argument
5846 if (!vhost->mq_enabled || !vhost->scsi_scrqs.scrqs) in ibmvfc_reg_sub_crqs()
5850 if (ibmvfc_register_scsi_channel(vhost, i)) { in ibmvfc_reg_sub_crqs()
5852 ibmvfc_deregister_scsi_channel(vhost, j - 1); in ibmvfc_reg_sub_crqs()
5853 vhost->do_enquiry = 0; in ibmvfc_reg_sub_crqs()
5861 static void ibmvfc_dereg_sub_crqs(struct ibmvfc_host *vhost) in ibmvfc_dereg_sub_crqs() argument
5866 if (!vhost->mq_enabled || !vhost->scsi_scrqs.scrqs) in ibmvfc_dereg_sub_crqs()
5870 ibmvfc_deregister_scsi_channel(vhost, i); in ibmvfc_dereg_sub_crqs()
5875 static void ibmvfc_init_sub_crqs(struct ibmvfc_host *vhost) in ibmvfc_init_sub_crqs() argument
5881 if (!vhost->mq_enabled) in ibmvfc_init_sub_crqs()
5884 vhost->scsi_scrqs.scrqs = kcalloc(nr_scsi_hw_queues, in ibmvfc_init_sub_crqs()
5885 sizeof(*vhost->scsi_scrqs.scrqs), in ibmvfc_init_sub_crqs()
5887 if (!vhost->scsi_scrqs.scrqs) { in ibmvfc_init_sub_crqs()
5888 vhost->do_enquiry = 0; in ibmvfc_init_sub_crqs()
5893 scrq = &vhost->scsi_scrqs.scrqs[i]; in ibmvfc_init_sub_crqs()
5894 if (ibmvfc_alloc_queue(vhost, scrq, IBMVFC_SUB_CRQ_FMT)) { in ibmvfc_init_sub_crqs()
5896 scrq = &vhost->scsi_scrqs.scrqs[j - 1]; in ibmvfc_init_sub_crqs()
5897 ibmvfc_free_queue(vhost, scrq); in ibmvfc_init_sub_crqs()
5899 kfree(vhost->scsi_scrqs.scrqs); in ibmvfc_init_sub_crqs()
5900 vhost->scsi_scrqs.scrqs = NULL; in ibmvfc_init_sub_crqs()
5901 vhost->scsi_scrqs.active_queues = 0; in ibmvfc_init_sub_crqs()
5902 vhost->do_enquiry = 0; in ibmvfc_init_sub_crqs()
5903 vhost->mq_enabled = 0; in ibmvfc_init_sub_crqs()
5908 ibmvfc_reg_sub_crqs(vhost); in ibmvfc_init_sub_crqs()
5913 static void ibmvfc_release_sub_crqs(struct ibmvfc_host *vhost) in ibmvfc_release_sub_crqs() argument
5919 if (!vhost->scsi_scrqs.scrqs) in ibmvfc_release_sub_crqs()
5922 ibmvfc_dereg_sub_crqs(vhost); in ibmvfc_release_sub_crqs()
5925 scrq = &vhost->scsi_scrqs.scrqs[i]; in ibmvfc_release_sub_crqs()
5926 ibmvfc_free_queue(vhost, scrq); in ibmvfc_release_sub_crqs()
5929 kfree(vhost->scsi_scrqs.scrqs); in ibmvfc_release_sub_crqs()
5930 vhost->scsi_scrqs.scrqs = NULL; in ibmvfc_release_sub_crqs()
5931 vhost->scsi_scrqs.active_queues = 0; in ibmvfc_release_sub_crqs()
5942 static void ibmvfc_free_mem(struct ibmvfc_host *vhost) in ibmvfc_free_mem() argument
5944 struct ibmvfc_queue *async_q = &vhost->async_crq; in ibmvfc_free_mem()
5947 mempool_destroy(vhost->tgt_pool); in ibmvfc_free_mem()
5948 kfree(vhost->trace); in ibmvfc_free_mem()
5949 dma_free_coherent(vhost->dev, vhost->disc_buf_sz, vhost->disc_buf, in ibmvfc_free_mem()
5950 vhost->disc_buf_dma); in ibmvfc_free_mem()
5951 dma_free_coherent(vhost->dev, sizeof(*vhost->login_buf), in ibmvfc_free_mem()
5952 vhost->login_buf, vhost->login_buf_dma); in ibmvfc_free_mem()
5953 dma_free_coherent(vhost->dev, sizeof(*vhost->channel_setup_buf), in ibmvfc_free_mem()
5954 vhost->channel_setup_buf, vhost->channel_setup_dma); in ibmvfc_free_mem()
5955 dma_pool_destroy(vhost->sg_pool); in ibmvfc_free_mem()
5956 ibmvfc_free_queue(vhost, async_q); in ibmvfc_free_mem()
5967 static int ibmvfc_alloc_mem(struct ibmvfc_host *vhost) in ibmvfc_alloc_mem() argument
5969 struct ibmvfc_queue *async_q = &vhost->async_crq; in ibmvfc_alloc_mem()
5970 struct device *dev = vhost->dev; in ibmvfc_alloc_mem()
5973 if (ibmvfc_alloc_queue(vhost, async_q, IBMVFC_ASYNC_FMT)) { in ibmvfc_alloc_mem()
5978 vhost->sg_pool = dma_pool_create(IBMVFC_NAME, dev, in ibmvfc_alloc_mem()
5982 if (!vhost->sg_pool) { in ibmvfc_alloc_mem()
5987 vhost->login_buf = dma_alloc_coherent(dev, sizeof(*vhost->login_buf), in ibmvfc_alloc_mem()
5988 &vhost->login_buf_dma, GFP_KERNEL); in ibmvfc_alloc_mem()
5990 if (!vhost->login_buf) { in ibmvfc_alloc_mem()
5995 vhost->disc_buf_sz = sizeof(*vhost->disc_buf) * max_targets; in ibmvfc_alloc_mem()
5996 vhost->disc_buf = dma_alloc_coherent(dev, vhost->disc_buf_sz, in ibmvfc_alloc_mem()
5997 &vhost->disc_buf_dma, GFP_KERNEL); in ibmvfc_alloc_mem()
5999 if (!vhost->disc_buf) { in ibmvfc_alloc_mem()
6004 vhost->trace = kcalloc(IBMVFC_NUM_TRACE_ENTRIES, in ibmvfc_alloc_mem()
6006 atomic_set(&vhost->trace_index, -1); in ibmvfc_alloc_mem()
6008 if (!vhost->trace) in ibmvfc_alloc_mem()
6011 vhost->tgt_pool = mempool_create_kmalloc_pool(IBMVFC_TGT_MEMPOOL_SZ, in ibmvfc_alloc_mem()
6014 if (!vhost->tgt_pool) { in ibmvfc_alloc_mem()
6019 vhost->channel_setup_buf = dma_alloc_coherent(dev, sizeof(*vhost->channel_setup_buf), in ibmvfc_alloc_mem()
6020 &vhost->channel_setup_dma, in ibmvfc_alloc_mem()
6023 if (!vhost->channel_setup_buf) { in ibmvfc_alloc_mem()
6032 mempool_destroy(vhost->tgt_pool); in ibmvfc_alloc_mem()
6034 kfree(vhost->trace); in ibmvfc_alloc_mem()
6036 dma_free_coherent(dev, vhost->disc_buf_sz, vhost->disc_buf, in ibmvfc_alloc_mem()
6037 vhost->disc_buf_dma); in ibmvfc_alloc_mem()
6039 dma_free_coherent(dev, sizeof(*vhost->login_buf), in ibmvfc_alloc_mem()
6040 vhost->login_buf, vhost->login_buf_dma); in ibmvfc_alloc_mem()
6042 dma_pool_destroy(vhost->sg_pool); in ibmvfc_alloc_mem()
6044 ibmvfc_free_queue(vhost, async_q); in ibmvfc_alloc_mem()
6057 struct ibmvfc_host *vhost = container_of(work, struct ibmvfc_host, in ibmvfc_rport_add_thread() local
6065 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_rport_add_thread()
6068 if (vhost->state != IBMVFC_ACTIVE) in ibmvfc_rport_add_thread()
6071 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_rport_add_thread()
6078 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_rport_add_thread()
6081 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_rport_add_thread()
6086 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_rport_add_thread()
6090 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_rport_add_thread()
6096 if (vhost->state == IBMVFC_ACTIVE) in ibmvfc_rport_add_thread()
6097 vhost->scan_complete = 1; in ibmvfc_rport_add_thread()
6098 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_rport_add_thread()
6112 struct ibmvfc_host *vhost; in ibmvfc_probe() local
6119 shost = scsi_host_alloc(&driver_template, sizeof(*vhost)); in ibmvfc_probe()
6134 vhost = shost_priv(shost); in ibmvfc_probe()
6135 INIT_LIST_HEAD(&vhost->targets); in ibmvfc_probe()
6136 INIT_LIST_HEAD(&vhost->purge); in ibmvfc_probe()
6137 sprintf(vhost->name, IBMVFC_NAME); in ibmvfc_probe()
6138 vhost->host = shost; in ibmvfc_probe()
6139 vhost->dev = dev; in ibmvfc_probe()
6140 vhost->partition_number = -1; in ibmvfc_probe()
6141 vhost->log_level = log_level; in ibmvfc_probe()
6142 vhost->task_set = 1; in ibmvfc_probe()
6144 vhost->mq_enabled = mq_enabled; in ibmvfc_probe()
6145 vhost->client_scsi_channels = min(shost->nr_hw_queues, nr_scsi_channels); in ibmvfc_probe()
6146 vhost->using_channels = 0; in ibmvfc_probe()
6147 vhost->do_enquiry = 1; in ibmvfc_probe()
6148 vhost->scan_timeout = 0; in ibmvfc_probe()
6150 strcpy(vhost->partition_name, "UNKNOWN"); in ibmvfc_probe()
6151 init_waitqueue_head(&vhost->work_wait_q); in ibmvfc_probe()
6152 init_waitqueue_head(&vhost->init_wait_q); in ibmvfc_probe()
6153 INIT_WORK(&vhost->rport_add_work_q, ibmvfc_rport_add_thread); in ibmvfc_probe()
6154 mutex_init(&vhost->passthru_mutex); in ibmvfc_probe()
6156 if ((rc = ibmvfc_alloc_mem(vhost))) in ibmvfc_probe()
6159 vhost->work_thread = kthread_run(ibmvfc_work, vhost, "%s_%d", IBMVFC_NAME, in ibmvfc_probe()
6162 if (IS_ERR(vhost->work_thread)) { in ibmvfc_probe()
6164 PTR_ERR(vhost->work_thread)); in ibmvfc_probe()
6165 rc = PTR_ERR(vhost->work_thread); in ibmvfc_probe()
6169 if ((rc = ibmvfc_init_crq(vhost))) { in ibmvfc_probe()
6185 ibmvfc_init_sub_crqs(vhost); in ibmvfc_probe()
6189 dev_set_drvdata(dev, vhost); in ibmvfc_probe()
6191 list_add_tail(&vhost->queue, &ibmvfc_head); in ibmvfc_probe()
6194 ibmvfc_send_crq_init(vhost); in ibmvfc_probe()
6201 ibmvfc_release_crq_queue(vhost); in ibmvfc_probe()
6203 kthread_stop(vhost->work_thread); in ibmvfc_probe()
6205 ibmvfc_free_mem(vhost); in ibmvfc_probe()
6222 struct ibmvfc_host *vhost = dev_get_drvdata(&vdev->dev); in ibmvfc_remove() local
6227 ibmvfc_remove_trace_file(&vhost->host->shost_dev.kobj, &ibmvfc_trace_attr); in ibmvfc_remove()
6229 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_remove()
6230 ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE); in ibmvfc_remove()
6231 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_remove()
6233 ibmvfc_wait_while_resetting(vhost); in ibmvfc_remove()
6234 kthread_stop(vhost->work_thread); in ibmvfc_remove()
6235 fc_remove_host(vhost->host); in ibmvfc_remove()
6236 scsi_remove_host(vhost->host); in ibmvfc_remove()
6238 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_remove()
6239 ibmvfc_purge_requests(vhost, DID_ERROR); in ibmvfc_remove()
6240 list_splice_init(&vhost->purge, &purge); in ibmvfc_remove()
6241 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_remove()
6243 ibmvfc_release_sub_crqs(vhost); in ibmvfc_remove()
6244 ibmvfc_release_crq_queue(vhost); in ibmvfc_remove()
6246 ibmvfc_free_mem(vhost); in ibmvfc_remove()
6248 list_del(&vhost->queue); in ibmvfc_remove()
6250 scsi_host_put(vhost->host); in ibmvfc_remove()
6265 struct ibmvfc_host *vhost = dev_get_drvdata(dev); in ibmvfc_resume() local
6268 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_resume()
6270 tasklet_schedule(&vhost->tasklet); in ibmvfc_resume()
6271 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_resume()