Lines Matching refs:vhost
160 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_trc_start() local
165 entry = &vhost->trace[vhost->trace_index++]; in ibmvfc_trc_start()
194 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_trc_end() local
197 struct ibmvfc_trace_entry *entry = &vhost->trace[vhost->trace_index++]; in ibmvfc_trc_end()
455 static int ibmvfc_set_host_state(struct ibmvfc_host *vhost, in ibmvfc_set_host_state() argument
460 switch (vhost->state) { in ibmvfc_set_host_state()
465 vhost->state = state; in ibmvfc_set_host_state()
478 static void ibmvfc_set_host_action(struct ibmvfc_host *vhost, in ibmvfc_set_host_action() argument
483 if (vhost->action == IBMVFC_HOST_ACTION_INIT_WAIT) in ibmvfc_set_host_action()
484 vhost->action = action; in ibmvfc_set_host_action()
487 if (vhost->action == IBMVFC_HOST_ACTION_LOGO) in ibmvfc_set_host_action()
488 vhost->action = action; in ibmvfc_set_host_action()
491 if (vhost->action == IBMVFC_HOST_ACTION_INIT) in ibmvfc_set_host_action()
492 vhost->action = action; in ibmvfc_set_host_action()
495 switch (vhost->action) { in ibmvfc_set_host_action()
499 vhost->action = action; in ibmvfc_set_host_action()
506 if (vhost->action == IBMVFC_HOST_ACTION_ALLOC_TGTS) in ibmvfc_set_host_action()
507 vhost->action = action; in ibmvfc_set_host_action()
511 switch (vhost->action) { in ibmvfc_set_host_action()
516 vhost->action = action; in ibmvfc_set_host_action()
527 vhost->action = action; in ibmvfc_set_host_action()
539 static void ibmvfc_reinit_host(struct ibmvfc_host *vhost) in ibmvfc_reinit_host() argument
541 if (vhost->action == IBMVFC_HOST_ACTION_NONE) { in ibmvfc_reinit_host()
542 if (!ibmvfc_set_host_state(vhost, IBMVFC_INITIALIZING)) { in ibmvfc_reinit_host()
543 scsi_block_requests(vhost->host); in ibmvfc_reinit_host()
544 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY); in ibmvfc_reinit_host()
547 vhost->reinit = 1; in ibmvfc_reinit_host()
549 wake_up(&vhost->work_wait_q); in ibmvfc_reinit_host()
558 static void ibmvfc_link_down(struct ibmvfc_host *vhost, in ibmvfc_link_down() argument
564 scsi_block_requests(vhost->host); in ibmvfc_link_down()
565 list_for_each_entry(tgt, &vhost->targets, queue) in ibmvfc_link_down()
567 ibmvfc_set_host_state(vhost, state); in ibmvfc_link_down()
568 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_DEL); in ibmvfc_link_down()
569 vhost->events_to_log |= IBMVFC_AE_LINKDOWN; in ibmvfc_link_down()
570 wake_up(&vhost->work_wait_q); in ibmvfc_link_down()
581 static void ibmvfc_init_host(struct ibmvfc_host *vhost) in ibmvfc_init_host() argument
585 if (vhost->action == IBMVFC_HOST_ACTION_INIT_WAIT) { in ibmvfc_init_host()
586 if (++vhost->init_retries > IBMVFC_MAX_HOST_INIT_RETRIES) { in ibmvfc_init_host()
587 dev_err(vhost->dev, in ibmvfc_init_host()
589 ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE); in ibmvfc_init_host()
594 if (!ibmvfc_set_host_state(vhost, IBMVFC_INITIALIZING)) { in ibmvfc_init_host()
595 memset(vhost->async_crq.msgs, 0, PAGE_SIZE); in ibmvfc_init_host()
596 vhost->async_crq.cur = 0; in ibmvfc_init_host()
598 list_for_each_entry(tgt, &vhost->targets, queue) in ibmvfc_init_host()
600 scsi_block_requests(vhost->host); in ibmvfc_init_host()
601 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT); in ibmvfc_init_host()
602 vhost->job_step = ibmvfc_npiv_login; in ibmvfc_init_host()
603 wake_up(&vhost->work_wait_q); in ibmvfc_init_host()
616 static int ibmvfc_send_crq(struct ibmvfc_host *vhost, u64 word1, u64 word2) in ibmvfc_send_crq() argument
618 struct vio_dev *vdev = to_vio_dev(vhost->dev); in ibmvfc_send_crq()
629 static int ibmvfc_send_crq_init(struct ibmvfc_host *vhost) in ibmvfc_send_crq_init() argument
631 ibmvfc_dbg(vhost, "Sending CRQ init\n"); in ibmvfc_send_crq_init()
632 return ibmvfc_send_crq(vhost, 0xC001000000000000LL, 0); in ibmvfc_send_crq_init()
642 static int ibmvfc_send_crq_init_complete(struct ibmvfc_host *vhost) in ibmvfc_send_crq_init_complete() argument
644 ibmvfc_dbg(vhost, "Sending CRQ init complete\n"); in ibmvfc_send_crq_init_complete()
645 return ibmvfc_send_crq(vhost, 0xC002000000000000LL, 0); in ibmvfc_send_crq_init_complete()
655 static void ibmvfc_release_crq_queue(struct ibmvfc_host *vhost) in ibmvfc_release_crq_queue() argument
658 struct vio_dev *vdev = to_vio_dev(vhost->dev); in ibmvfc_release_crq_queue()
659 struct ibmvfc_crq_queue *crq = &vhost->crq; in ibmvfc_release_crq_queue()
661 ibmvfc_dbg(vhost, "Releasing CRQ\n"); in ibmvfc_release_crq_queue()
662 free_irq(vdev->irq, vhost); in ibmvfc_release_crq_queue()
663 tasklet_kill(&vhost->tasklet); in ibmvfc_release_crq_queue()
670 vhost->state = IBMVFC_NO_CRQ; in ibmvfc_release_crq_queue()
671 vhost->logged_in = 0; in ibmvfc_release_crq_queue()
672 dma_unmap_single(vhost->dev, crq->msg_token, PAGE_SIZE, DMA_BIDIRECTIONAL); in ibmvfc_release_crq_queue()
683 static int ibmvfc_reenable_crq_queue(struct ibmvfc_host *vhost) in ibmvfc_reenable_crq_queue() argument
686 struct vio_dev *vdev = to_vio_dev(vhost->dev); in ibmvfc_reenable_crq_queue()
696 dev_err(vhost->dev, "Error enabling adapter (rc=%d)\n", rc); in ibmvfc_reenable_crq_queue()
708 static int ibmvfc_reset_crq(struct ibmvfc_host *vhost) in ibmvfc_reset_crq() argument
712 struct vio_dev *vdev = to_vio_dev(vhost->dev); in ibmvfc_reset_crq()
713 struct ibmvfc_crq_queue *crq = &vhost->crq; in ibmvfc_reset_crq()
722 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_reset_crq()
723 vhost->state = IBMVFC_NO_CRQ; in ibmvfc_reset_crq()
724 vhost->logged_in = 0; in ibmvfc_reset_crq()
736 dev_warn(vhost->dev, "Partner adapter not ready\n"); in ibmvfc_reset_crq()
738 dev_warn(vhost->dev, "Couldn't register crq (rc=%d)\n", rc); in ibmvfc_reset_crq()
739 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_reset_crq()
770 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_free_event() local
771 struct ibmvfc_event_pool *pool = &vhost->pool; in ibmvfc_free_event()
775 list_add_tail(&evt->queue, &vhost->free); in ibmvfc_free_event()
830 static void ibmvfc_purge_requests(struct ibmvfc_host *vhost, int error_code) in ibmvfc_purge_requests() argument
834 ibmvfc_dbg(vhost, "Purging all requests\n"); in ibmvfc_purge_requests()
835 list_for_each_entry_safe(evt, pos, &vhost->sent, queue) in ibmvfc_purge_requests()
843 static void ibmvfc_hard_reset_host(struct ibmvfc_host *vhost) in ibmvfc_hard_reset_host() argument
845 ibmvfc_purge_requests(vhost, DID_ERROR); in ibmvfc_hard_reset_host()
846 ibmvfc_link_down(vhost, IBMVFC_LINK_DOWN); in ibmvfc_hard_reset_host()
847 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_RESET); in ibmvfc_hard_reset_host()
854 static void __ibmvfc_reset_host(struct ibmvfc_host *vhost) in __ibmvfc_reset_host() argument
856 if (vhost->logged_in && vhost->action != IBMVFC_HOST_ACTION_LOGO_WAIT && in __ibmvfc_reset_host()
857 !ibmvfc_set_host_state(vhost, IBMVFC_INITIALIZING)) { in __ibmvfc_reset_host()
858 scsi_block_requests(vhost->host); in __ibmvfc_reset_host()
859 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_LOGO); in __ibmvfc_reset_host()
860 vhost->job_step = ibmvfc_npiv_logout; in __ibmvfc_reset_host()
861 wake_up(&vhost->work_wait_q); in __ibmvfc_reset_host()
863 ibmvfc_hard_reset_host(vhost); in __ibmvfc_reset_host()
870 static void ibmvfc_reset_host(struct ibmvfc_host *vhost) in ibmvfc_reset_host() argument
874 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_reset_host()
875 __ibmvfc_reset_host(vhost); in ibmvfc_reset_host()
876 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_reset_host()
886 static int ibmvfc_retry_host_init(struct ibmvfc_host *vhost) in ibmvfc_retry_host_init() argument
890 if (vhost->action == IBMVFC_HOST_ACTION_INIT_WAIT) { in ibmvfc_retry_host_init()
891 vhost->delay_init = 1; in ibmvfc_retry_host_init()
892 if (++vhost->init_retries > IBMVFC_MAX_HOST_INIT_RETRIES) { in ibmvfc_retry_host_init()
893 dev_err(vhost->dev, in ibmvfc_retry_host_init()
895 ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE); in ibmvfc_retry_host_init()
896 } else if (vhost->init_retries == IBMVFC_MAX_HOST_INIT_RETRIES) in ibmvfc_retry_host_init()
897 __ibmvfc_reset_host(vhost); in ibmvfc_retry_host_init()
899 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT); in ibmvfc_retry_host_init()
904 wake_up(&vhost->work_wait_q); in ibmvfc_retry_host_init()
918 struct ibmvfc_host *vhost = shost_priv(shost); in __ibmvfc_get_target() local
921 list_for_each_entry(tgt, &vhost->targets, queue) in __ibmvfc_get_target()
957 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_get_host_speed() local
961 if (vhost->state == IBMVFC_ACTIVE) { in ibmvfc_get_host_speed()
962 switch (be64_to_cpu(vhost->login_buf->resp.link_speed) / 100) { in ibmvfc_get_host_speed()
982 ibmvfc_log(vhost, 3, "Unknown port speed: %lld Gbit\n", in ibmvfc_get_host_speed()
983 be64_to_cpu(vhost->login_buf->resp.link_speed) / 100); in ibmvfc_get_host_speed()
1001 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_get_host_port_state() local
1005 switch (vhost->state) { in ibmvfc_get_host_port_state()
1024 ibmvfc_log(vhost, 3, "Unknown port state: %d\n", vhost->state); in ibmvfc_get_host_port_state()
1110 static int ibmvfc_wait_while_resetting(struct ibmvfc_host *vhost) in ibmvfc_wait_while_resetting() argument
1112 long timeout = wait_event_timeout(vhost->init_wait_q, in ibmvfc_wait_while_resetting()
1113 ((vhost->state == IBMVFC_ACTIVE || in ibmvfc_wait_while_resetting()
1114 vhost->state == IBMVFC_HOST_OFFLINE || in ibmvfc_wait_while_resetting()
1115 vhost->state == IBMVFC_LINK_DEAD) && in ibmvfc_wait_while_resetting()
1116 vhost->action == IBMVFC_HOST_ACTION_NONE), in ibmvfc_wait_while_resetting()
1131 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_issue_fc_host_lip() local
1133 dev_err(vhost->dev, "Initiating host LIP. Resetting connection\n"); in ibmvfc_issue_fc_host_lip()
1134 ibmvfc_reset_host(vhost); in ibmvfc_issue_fc_host_lip()
1135 return ibmvfc_wait_while_resetting(vhost); in ibmvfc_issue_fc_host_lip()
1144 static void ibmvfc_gather_partition_info(struct ibmvfc_host *vhost) in ibmvfc_gather_partition_info() argument
1156 strncpy(vhost->partition_name, name, sizeof(vhost->partition_name)); in ibmvfc_gather_partition_info()
1159 vhost->partition_number = *num; in ibmvfc_gather_partition_info()
1170 static void ibmvfc_set_login_info(struct ibmvfc_host *vhost) in ibmvfc_set_login_info() argument
1172 struct ibmvfc_npiv_login *login_info = &vhost->login_info; in ibmvfc_set_login_info()
1173 struct device_node *of_node = vhost->dev->of_node; in ibmvfc_set_login_info()
1182 login_info->partition_num = cpu_to_be32(vhost->partition_number); in ibmvfc_set_login_info()
1186 if (vhost->client_migrated) in ibmvfc_set_login_info()
1191 login_info->async.va = cpu_to_be64(vhost->async_crq.msg_token); in ibmvfc_set_login_info()
1192 login_info->async.len = cpu_to_be32(vhost->async_crq.size * sizeof(*vhost->async_crq.msgs)); in ibmvfc_set_login_info()
1193 strncpy(login_info->partition_name, vhost->partition_name, IBMVFC_MAX_NAME); in ibmvfc_set_login_info()
1195 dev_name(&vhost->host->shost_gendev), IBMVFC_MAX_NAME); in ibmvfc_set_login_info()
1198 location = location ? location : dev_name(vhost->dev); in ibmvfc_set_login_info()
1208 static int ibmvfc_init_event_pool(struct ibmvfc_host *vhost) in ibmvfc_init_event_pool() argument
1211 struct ibmvfc_event_pool *pool = &vhost->pool; in ibmvfc_init_event_pool()
1219 pool->iu_storage = dma_alloc_coherent(vhost->dev, in ibmvfc_init_event_pool()
1234 evt->vhost = vhost; in ibmvfc_init_event_pool()
1236 list_add_tail(&evt->queue, &vhost->free); in ibmvfc_init_event_pool()
1248 static void ibmvfc_free_event_pool(struct ibmvfc_host *vhost) in ibmvfc_free_event_pool() argument
1251 struct ibmvfc_event_pool *pool = &vhost->pool; in ibmvfc_free_event_pool()
1258 dma_pool_free(vhost->sg_pool, in ibmvfc_free_event_pool()
1264 dma_free_coherent(vhost->dev, in ibmvfc_free_event_pool()
1276 static struct ibmvfc_event *ibmvfc_get_event(struct ibmvfc_host *vhost) in ibmvfc_get_event() argument
1280 BUG_ON(list_empty(&vhost->free)); in ibmvfc_get_event()
1281 evt = list_entry(vhost->free.next, struct ibmvfc_event, queue); in ibmvfc_get_event()
1340 struct ibmvfc_host *vhost = dev_get_drvdata(dev); in ibmvfc_map_sg_data() local
1350 if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL) in ibmvfc_map_sg_data()
1371 evt->ext_list = dma_pool_alloc(vhost->sg_pool, GFP_ATOMIC, in ibmvfc_map_sg_data()
1376 if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL) in ibmvfc_map_sg_data()
1399 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_timeout() local
1400 dev_err(vhost->dev, "Command timed out (%p). Resetting connection\n", evt); in ibmvfc_timeout()
1401 ibmvfc_reset_host(vhost); in ibmvfc_timeout()
1413 struct ibmvfc_host *vhost, unsigned long timeout) in ibmvfc_send_event() argument
1427 list_add_tail(&evt->queue, &vhost->sent); in ibmvfc_send_event()
1437 if ((rc = ibmvfc_send_crq(vhost, be64_to_cpu(crq_as_u64[0]), in ibmvfc_send_event()
1449 dev_warn(vhost->dev, "Send warning. Receive queue closed, will retry.\n"); in ibmvfc_send_event()
1456 dev_err(vhost->dev, "Send error (rc=%d)\n", rc); in ibmvfc_send_event()
1478 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_log_error() local
1491 if (!logerr && (vhost->log_level <= (IBMVFC_DEFAULT_LOG_LEVEL + 1))) in ibmvfc_log_error()
1510 struct ibmvfc_host *vhost = shost_priv(sdev->host); in ibmvfc_relogin() local
1514 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_relogin()
1521 ibmvfc_reinit_host(vhost); in ibmvfc_relogin()
1586 static inline int ibmvfc_host_chkready(struct ibmvfc_host *vhost) in ibmvfc_host_chkready() argument
1590 switch (vhost->state) { in ibmvfc_host_chkready()
1620 struct ibmvfc_host *vhost = shost_priv(cmnd->device->host); in ibmvfc_queuecommand_lck() local
1627 unlikely((rc = ibmvfc_host_chkready(vhost)))) { in ibmvfc_queuecommand_lck()
1634 evt = ibmvfc_get_event(vhost); in ibmvfc_queuecommand_lck()
1656 if (likely(!(rc = ibmvfc_map_sg_data(cmnd, evt, vfc_cmd, vhost->dev)))) in ibmvfc_queuecommand_lck()
1657 return ibmvfc_send_event(evt, vhost, 0); in ibmvfc_queuecommand_lck()
1663 if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL) in ibmvfc_queuecommand_lck()
1695 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_bsg_timeout_done() local
1698 vhost->aborting_passthru = 0; in ibmvfc_bsg_timeout_done()
1699 dev_info(vhost->dev, "Passthru command cancelled\n"); in ibmvfc_bsg_timeout_done()
1711 struct ibmvfc_host *vhost = shost_priv(fc_bsg_to_shost(job)); in ibmvfc_bsg_timeout() local
1719 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_bsg_timeout()
1720 if (vhost->aborting_passthru || vhost->state != IBMVFC_ACTIVE) { in ibmvfc_bsg_timeout()
1721 __ibmvfc_reset_host(vhost); in ibmvfc_bsg_timeout()
1722 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_bsg_timeout()
1726 vhost->aborting_passthru = 1; in ibmvfc_bsg_timeout()
1727 evt = ibmvfc_get_event(vhost); in ibmvfc_bsg_timeout()
1738 rc = ibmvfc_send_event(evt, vhost, default_timeout); in ibmvfc_bsg_timeout()
1741 vhost->aborting_passthru = 0; in ibmvfc_bsg_timeout()
1742 dev_err(vhost->dev, "Failed to send cancel event. rc=%d\n", rc); in ibmvfc_bsg_timeout()
1745 dev_info(vhost->dev, "Cancelling passthru command to port id 0x%lx\n", in ibmvfc_bsg_timeout()
1748 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_bsg_timeout()
1762 static int ibmvfc_bsg_plogi(struct ibmvfc_host *vhost, unsigned int port_id) in ibmvfc_bsg_plogi() argument
1772 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_bsg_plogi()
1773 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_bsg_plogi()
1782 if (unlikely((rc = ibmvfc_host_chkready(vhost)))) in ibmvfc_bsg_plogi()
1785 evt = ibmvfc_get_event(vhost); in ibmvfc_bsg_plogi()
1796 rc = ibmvfc_send_event(evt, vhost, default_timeout); in ibmvfc_bsg_plogi()
1797 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_bsg_plogi()
1807 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_bsg_plogi()
1810 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_bsg_plogi()
1824 struct ibmvfc_host *vhost = shost_priv(fc_bsg_to_shost(job)); in ibmvfc_bsg_request() local
1863 if (!mutex_trylock(&vhost->passthru_mutex)) in ibmvfc_bsg_request()
1867 req_seg = dma_map_sg(vhost->dev, job->request_payload.sg_list, in ibmvfc_bsg_request()
1871 mutex_unlock(&vhost->passthru_mutex); in ibmvfc_bsg_request()
1875 rsp_seg = dma_map_sg(vhost->dev, job->reply_payload.sg_list, in ibmvfc_bsg_request()
1879 dma_unmap_sg(vhost->dev, job->request_payload.sg_list, in ibmvfc_bsg_request()
1881 mutex_unlock(&vhost->passthru_mutex); in ibmvfc_bsg_request()
1891 rc = ibmvfc_bsg_plogi(vhost, port_id); in ibmvfc_bsg_request()
1893 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_bsg_request()
1896 unlikely((rc = ibmvfc_host_chkready(vhost)))) { in ibmvfc_bsg_request()
1897 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_bsg_request()
1901 evt = ibmvfc_get_event(vhost); in ibmvfc_bsg_request()
1929 rc = ibmvfc_send_event(evt, vhost, 0); in ibmvfc_bsg_request()
1930 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_bsg_request()
1944 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_bsg_request()
1946 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_bsg_request()
1952 dma_unmap_sg(vhost->dev, job->request_payload.sg_list, in ibmvfc_bsg_request()
1954 dma_unmap_sg(vhost->dev, job->reply_payload.sg_list, in ibmvfc_bsg_request()
1956 mutex_unlock(&vhost->passthru_mutex); in ibmvfc_bsg_request()
1972 struct ibmvfc_host *vhost = shost_priv(sdev->host); in ibmvfc_reset_device() local
1982 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_reset_device()
1983 if (vhost->state == IBMVFC_ACTIVE) { in ibmvfc_reset_device()
1984 evt = ibmvfc_get_event(vhost); in ibmvfc_reset_device()
2002 rsp_rc = ibmvfc_send_event(evt, vhost, default_timeout); in ibmvfc_reset_device()
2004 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_reset_device()
2031 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_reset_device()
2033 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_reset_device()
2096 static int ibmvfc_wait_for_ops(struct ibmvfc_host *vhost, void *device, in ibmvfc_wait_for_ops() argument
2108 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_wait_for_ops()
2109 list_for_each_entry(evt, &vhost->sent, queue) { in ibmvfc_wait_for_ops()
2115 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_wait_for_ops()
2122 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_wait_for_ops()
2123 list_for_each_entry(evt, &vhost->sent, queue) { in ibmvfc_wait_for_ops()
2129 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_wait_for_ops()
2131 dev_err(vhost->dev, "Timed out waiting for aborted commands\n"); in ibmvfc_wait_for_ops()
2155 struct ibmvfc_host *vhost = shost_priv(sdev->host); in ibmvfc_cancel_all() local
2166 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_cancel_all()
2168 list_for_each_entry(evt, &vhost->sent, queue) { in ibmvfc_cancel_all()
2176 if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL) in ibmvfc_cancel_all()
2178 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_cancel_all()
2182 if (vhost->logged_in) { in ibmvfc_cancel_all()
2183 evt = ibmvfc_get_event(vhost); in ibmvfc_cancel_all()
2193 if (!(be64_to_cpu(vhost->login_buf->resp.capabilities) & IBMVFC_CAN_SUPPRESS_ABTS)) in ibmvfc_cancel_all()
2195 if (vhost->state == IBMVFC_ACTIVE) in ibmvfc_cancel_all()
2204 rsp_rc = ibmvfc_send_event(evt, vhost, default_timeout); in ibmvfc_cancel_all()
2207 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_cancel_all()
2221 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_cancel_all()
2223 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_cancel_all()
2287 struct ibmvfc_host *vhost = shost_priv(sdev->host); in ibmvfc_abort_task_set() local
2297 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_abort_task_set()
2299 list_for_each_entry(evt, &vhost->sent, queue) { in ibmvfc_abort_task_set()
2307 if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL) in ibmvfc_abort_task_set()
2309 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_abort_task_set()
2313 if (vhost->state == IBMVFC_ACTIVE) { in ibmvfc_abort_task_set()
2314 evt = ibmvfc_get_event(vhost); in ibmvfc_abort_task_set()
2332 rsp_rc = ibmvfc_send_event(evt, vhost, default_timeout); in ibmvfc_abort_task_set()
2335 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_abort_task_set()
2348 rc = ibmvfc_wait_for_ops(vhost, sdev->hostdata, ibmvfc_match_key); in ibmvfc_abort_task_set()
2355 ibmvfc_reset_host(vhost); in ibmvfc_abort_task_set()
2357 rc = ibmvfc_wait_for_ops(vhost, sdev->hostdata, ibmvfc_match_key); in ibmvfc_abort_task_set()
2362 rc = ibmvfc_wait_for_ops(vhost, evt, ibmvfc_match_evt); in ibmvfc_abort_task_set()
2364 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_abort_task_set()
2365 ibmvfc_hard_reset_host(vhost); in ibmvfc_abort_task_set()
2366 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_abort_task_set()
2391 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_abort_task_set()
2393 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_abort_task_set()
2407 struct ibmvfc_host *vhost = shost_priv(sdev->host); in ibmvfc_eh_abort_handler() local
2413 ibmvfc_wait_while_resetting(vhost); in ibmvfc_eh_abort_handler()
2421 rc = ibmvfc_wait_for_ops(vhost, sdev, ibmvfc_match_lun); in ibmvfc_eh_abort_handler()
2440 struct ibmvfc_host *vhost = shost_priv(sdev->host); in ibmvfc_eh_device_reset_handler() local
2446 ibmvfc_wait_while_resetting(vhost); in ibmvfc_eh_device_reset_handler()
2454 rc = ibmvfc_wait_for_ops(vhost, sdev, ibmvfc_match_lun); in ibmvfc_eh_device_reset_handler()
2497 struct ibmvfc_host *vhost = shost_priv(sdev->host); in ibmvfc_eh_target_reset_handler() local
2506 ibmvfc_wait_while_resetting(vhost); in ibmvfc_eh_target_reset_handler()
2514 rc = ibmvfc_wait_for_ops(vhost, starget, ibmvfc_match_target); in ibmvfc_eh_target_reset_handler()
2531 struct ibmvfc_host *vhost = shost_priv(cmd->device->host); in ibmvfc_eh_host_reset_handler() local
2533 dev_err(vhost->dev, "Resetting connection due to error recovery\n"); in ibmvfc_eh_host_reset_handler()
2534 rc = ibmvfc_issue_fc_host_lip(vhost->host); in ibmvfc_eh_host_reset_handler()
2549 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_terminate_rport_io() local
2562 rc = ibmvfc_wait_for_ops(vhost, rport, ibmvfc_match_rport); in ibmvfc_terminate_rport_io()
2638 struct ibmvfc_host *vhost) in ibmvfc_handle_async() argument
2643 ibmvfc_log(vhost, desc->log_level, "%s event received. scsi_id: %llx, wwpn: %llx," in ibmvfc_handle_async()
2652 ibmvfc_link_down(vhost, IBMVFC_LINK_DOWN); in ibmvfc_handle_async()
2655 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_handle_async()
2660 vhost->events_to_log |= IBMVFC_AE_LINKUP; in ibmvfc_handle_async()
2661 vhost->delay_init = 1; in ibmvfc_handle_async()
2662 __ibmvfc_reset_host(vhost); in ibmvfc_handle_async()
2668 vhost->events_to_log |= IBMVFC_AE_LINKUP; in ibmvfc_handle_async()
2669 vhost->delay_init = 1; in ibmvfc_handle_async()
2670 __ibmvfc_reset_host(vhost); in ibmvfc_handle_async()
2674 vhost->events_to_log |= IBMVFC_AE_RSCN; in ibmvfc_handle_async()
2675 if (vhost->state < IBMVFC_HALTED) { in ibmvfc_handle_async()
2676 vhost->delay_init = 1; in ibmvfc_handle_async()
2677 __ibmvfc_reset_host(vhost); in ibmvfc_handle_async()
2682 vhost->events_to_log |= IBMVFC_AE_RSCN; in ibmvfc_handle_async()
2683 ibmvfc_reinit_host(vhost); in ibmvfc_handle_async()
2688 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_handle_async()
2701 ibmvfc_reinit_host(vhost); in ibmvfc_handle_async()
2707 ibmvfc_link_down(vhost, IBMVFC_LINK_DOWN); in ibmvfc_handle_async()
2710 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_handle_async()
2713 ibmvfc_link_down(vhost, IBMVFC_HALTED); in ibmvfc_handle_async()
2716 dev_err(vhost->dev, "Unknown async event received: %lld\n", crq->event); in ibmvfc_handle_async()
2727 static void ibmvfc_handle_crq(struct ibmvfc_crq *crq, struct ibmvfc_host *vhost) in ibmvfc_handle_crq() argument
2736 dev_info(vhost->dev, "Partner initialized\n"); in ibmvfc_handle_crq()
2738 rc = ibmvfc_send_crq_init_complete(vhost); in ibmvfc_handle_crq()
2740 ibmvfc_init_host(vhost); in ibmvfc_handle_crq()
2742 dev_err(vhost->dev, "Unable to send init rsp. rc=%ld\n", rc); in ibmvfc_handle_crq()
2745 dev_info(vhost->dev, "Partner initialization complete\n"); in ibmvfc_handle_crq()
2746 ibmvfc_init_host(vhost); in ibmvfc_handle_crq()
2749 dev_err(vhost->dev, "Unknown crq message type: %d\n", crq->format); in ibmvfc_handle_crq()
2753 vhost->state = IBMVFC_NO_CRQ; in ibmvfc_handle_crq()
2754 vhost->logged_in = 0; in ibmvfc_handle_crq()
2755 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE); in ibmvfc_handle_crq()
2758 dev_info(vhost->dev, "Re-enabling adapter\n"); in ibmvfc_handle_crq()
2759 vhost->client_migrated = 1; in ibmvfc_handle_crq()
2760 ibmvfc_purge_requests(vhost, DID_REQUEUE); in ibmvfc_handle_crq()
2761 ibmvfc_link_down(vhost, IBMVFC_LINK_DOWN); in ibmvfc_handle_crq()
2762 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_REENABLE); in ibmvfc_handle_crq()
2764 dev_err(vhost->dev, "Virtual adapter failed (rc=%d)\n", crq->format); in ibmvfc_handle_crq()
2765 ibmvfc_purge_requests(vhost, DID_ERROR); in ibmvfc_handle_crq()
2766 ibmvfc_link_down(vhost, IBMVFC_LINK_DOWN); in ibmvfc_handle_crq()
2767 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_RESET); in ibmvfc_handle_crq()
2773 dev_err(vhost->dev, "Got an invalid message type 0x%02x\n", crq->valid); in ibmvfc_handle_crq()
2784 if (unlikely(!ibmvfc_valid_event(&vhost->pool, evt))) { in ibmvfc_handle_crq()
2785 dev_err(vhost->dev, "Returned correlation_token 0x%08llx is invalid!\n", in ibmvfc_handle_crq()
2791 dev_err(vhost->dev, "Received duplicate correlation_token 0x%08llx!\n", in ibmvfc_handle_crq()
2813 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_scan_finished() local
2818 dev_info(vhost->dev, "Scan taking longer than %d seconds, " in ibmvfc_scan_finished()
2823 if (vhost->scan_complete) in ibmvfc_scan_finished()
2843 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_slave_alloc() local
2850 sdev->hostdata = (void *)(unsigned long)vhost->task_set++; in ibmvfc_slave_alloc()
2868 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_target_alloc() local
2872 starget->hostdata = (void *)(unsigned long)vhost->task_set++; in ibmvfc_target_alloc()
2920 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_show_host_partition_name() local
2923 vhost->login_buf->resp.partition_name); in ibmvfc_show_host_partition_name()
2930 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_show_host_device_name() local
2933 vhost->login_buf->resp.device_name); in ibmvfc_show_host_device_name()
2940 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_show_host_loc_code() local
2943 vhost->login_buf->resp.port_loc_code); in ibmvfc_show_host_loc_code()
2950 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_show_host_drc_name() local
2953 vhost->login_buf->resp.drc_name); in ibmvfc_show_host_drc_name()
2960 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_show_host_npiv_version() local
2961 return snprintf(buf, PAGE_SIZE, "%d\n", vhost->login_buf->resp.version); in ibmvfc_show_host_npiv_version()
2968 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_show_host_capabilities() local
2969 return snprintf(buf, PAGE_SIZE, "%llx\n", vhost->login_buf->resp.capabilities); in ibmvfc_show_host_capabilities()
2984 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_show_log_level() local
2989 len = snprintf(buf, PAGE_SIZE, "%d\n", vhost->log_level); in ibmvfc_show_log_level()
3007 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_store_log_level() local
3011 vhost->log_level = simple_strtoul(buf, NULL, 10); in ibmvfc_store_log_level()
3044 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_read_trace() local
3047 char *src = (char *)vhost->trace; in ibmvfc_read_trace()
3115 static struct ibmvfc_async_crq *ibmvfc_next_async_crq(struct ibmvfc_host *vhost) in ibmvfc_next_async_crq() argument
3117 struct ibmvfc_async_crq_queue *async_crq = &vhost->async_crq; in ibmvfc_next_async_crq()
3138 static struct ibmvfc_crq *ibmvfc_next_crq(struct ibmvfc_host *vhost) in ibmvfc_next_crq() argument
3140 struct ibmvfc_crq_queue *queue = &vhost->crq; in ibmvfc_next_crq()
3164 struct ibmvfc_host *vhost = (struct ibmvfc_host *)dev_instance; in ibmvfc_interrupt() local
3167 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_interrupt()
3168 vio_disable_interrupts(to_vio_dev(vhost->dev)); in ibmvfc_interrupt()
3169 tasklet_schedule(&vhost->tasklet); in ibmvfc_interrupt()
3170 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_interrupt()
3183 struct ibmvfc_host *vhost = data; in ibmvfc_tasklet() local
3184 struct vio_dev *vdev = to_vio_dev(vhost->dev); in ibmvfc_tasklet()
3190 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_tasklet()
3193 while ((async = ibmvfc_next_async_crq(vhost)) != NULL) { in ibmvfc_tasklet()
3194 ibmvfc_handle_async(async, vhost); in ibmvfc_tasklet()
3200 while ((crq = ibmvfc_next_crq(vhost)) != NULL) { in ibmvfc_tasklet()
3201 ibmvfc_handle_crq(crq, vhost); in ibmvfc_tasklet()
3207 if ((async = ibmvfc_next_async_crq(vhost)) != NULL) { in ibmvfc_tasklet()
3209 ibmvfc_handle_async(async, vhost); in ibmvfc_tasklet()
3212 } else if ((crq = ibmvfc_next_crq(vhost)) != NULL) { in ibmvfc_tasklet()
3214 ibmvfc_handle_crq(crq, vhost); in ibmvfc_tasklet()
3221 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_tasklet()
3235 wake_up(&tgt->vhost->work_wait_q); in ibmvfc_init_tgt()
3251 wake_up(&tgt->vhost->work_wait_q); in ibmvfc_retry_tgt_init()
3300 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_prli_done() local
3306 vhost->discovery_threads--; in ibmvfc_tgt_prli_done()
3358 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_prli_done()
3369 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_send_prli() local
3372 if (vhost->discovery_threads >= disc_threads) in ibmvfc_tgt_send_prli()
3376 evt = ibmvfc_get_event(vhost); in ibmvfc_tgt_send_prli()
3377 vhost->discovery_threads++; in ibmvfc_tgt_send_prli()
3396 if (ibmvfc_send_event(evt, vhost, default_timeout)) { in ibmvfc_tgt_send_prli()
3397 vhost->discovery_threads--; in ibmvfc_tgt_send_prli()
3412 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_plogi_done() local
3417 vhost->discovery_threads--; in ibmvfc_tgt_plogi_done()
3424 vhost->reinit = 1; in ibmvfc_tgt_plogi_done()
3458 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_plogi_done()
3469 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_send_plogi() local
3472 if (vhost->discovery_threads >= disc_threads) in ibmvfc_tgt_send_plogi()
3477 evt = ibmvfc_get_event(vhost); in ibmvfc_tgt_send_plogi()
3478 vhost->discovery_threads++; in ibmvfc_tgt_send_plogi()
3489 if (ibmvfc_send_event(evt, vhost, default_timeout)) { in ibmvfc_tgt_send_plogi()
3490 vhost->discovery_threads--; in ibmvfc_tgt_send_plogi()
3505 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_implicit_logout_done() local
3509 vhost->discovery_threads--; in ibmvfc_tgt_implicit_logout_done()
3519 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_implicit_logout_done()
3527 if (vhost->action == IBMVFC_HOST_ACTION_TGT_INIT) in ibmvfc_tgt_implicit_logout_done()
3529 else if (vhost->action == IBMVFC_HOST_ACTION_QUERY_TGTS && in ibmvfc_tgt_implicit_logout_done()
3533 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_implicit_logout_done()
3544 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_implicit_logout() local
3547 if (vhost->discovery_threads >= disc_threads) in ibmvfc_tgt_implicit_logout()
3551 evt = ibmvfc_get_event(vhost); in ibmvfc_tgt_implicit_logout()
3552 vhost->discovery_threads++; in ibmvfc_tgt_implicit_logout()
3563 if (ibmvfc_send_event(evt, vhost, default_timeout)) { in ibmvfc_tgt_implicit_logout()
3564 vhost->discovery_threads--; in ibmvfc_tgt_implicit_logout()
3599 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_adisc_done() local
3604 vhost->discovery_threads--; in ibmvfc_tgt_adisc_done()
3631 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_adisc_done()
3674 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_adisc_cancel_done() local
3678 vhost->abort_threads--; in ibmvfc_tgt_adisc_cancel_done()
3681 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_adisc_cancel_done()
3695 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_adisc_timeout() local
3702 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_adisc_timeout()
3703 if (vhost->abort_threads >= disc_threads || in ibmvfc_adisc_timeout()
3705 vhost->state != IBMVFC_INITIALIZING || in ibmvfc_adisc_timeout()
3706 vhost->action != IBMVFC_HOST_ACTION_QUERY_TGTS) { in ibmvfc_adisc_timeout()
3707 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_adisc_timeout()
3711 vhost->abort_threads++; in ibmvfc_adisc_timeout()
3713 evt = ibmvfc_get_event(vhost); in ibmvfc_adisc_timeout()
3725 rc = ibmvfc_send_event(evt, vhost, default_timeout); in ibmvfc_adisc_timeout()
3729 vhost->abort_threads--; in ibmvfc_adisc_timeout()
3731 __ibmvfc_reset_host(vhost); in ibmvfc_adisc_timeout()
3734 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_adisc_timeout()
3751 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_adisc() local
3754 if (vhost->discovery_threads >= disc_threads) in ibmvfc_tgt_adisc()
3758 evt = ibmvfc_get_event(vhost); in ibmvfc_tgt_adisc()
3759 vhost->discovery_threads++; in ibmvfc_tgt_adisc()
3770 memcpy(&mad->fc_iu.payload[2], &vhost->login_buf->resp.port_name, in ibmvfc_tgt_adisc()
3771 sizeof(vhost->login_buf->resp.port_name)); in ibmvfc_tgt_adisc()
3772 memcpy(&mad->fc_iu.payload[4], &vhost->login_buf->resp.node_name, in ibmvfc_tgt_adisc()
3773 sizeof(vhost->login_buf->resp.node_name)); in ibmvfc_tgt_adisc()
3774 mad->fc_iu.payload[6] = cpu_to_be32(be64_to_cpu(vhost->login_buf->resp.scsi_id) & 0x00ffffff); in ibmvfc_tgt_adisc()
3784 if (ibmvfc_send_event(evt, vhost, IBMVFC_ADISC_PLUS_CANCEL_TIMEOUT)) { in ibmvfc_tgt_adisc()
3785 vhost->discovery_threads--; in ibmvfc_tgt_adisc()
3801 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_query_target_done() local
3806 vhost->discovery_threads--; in ibmvfc_tgt_query_target_done()
3843 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_query_target_done()
3854 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_query_target() local
3857 if (vhost->discovery_threads >= disc_threads) in ibmvfc_tgt_query_target()
3861 evt = ibmvfc_get_event(vhost); in ibmvfc_tgt_query_target()
3862 vhost->discovery_threads++; in ibmvfc_tgt_query_target()
3873 if (ibmvfc_send_event(evt, vhost, default_timeout)) { in ibmvfc_tgt_query_target()
3874 vhost->discovery_threads--; in ibmvfc_tgt_query_target()
3889 static int ibmvfc_alloc_target(struct ibmvfc_host *vhost, u64 scsi_id) in ibmvfc_alloc_target() argument
3894 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_alloc_target()
3895 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_alloc_target()
3902 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_alloc_target()
3904 tgt = mempool_alloc(vhost->tgt_pool, GFP_NOIO); in ibmvfc_alloc_target()
3908 tgt->vhost = vhost; in ibmvfc_alloc_target()
3910 tgt->cancel_key = vhost->task_set++; in ibmvfc_alloc_target()
3914 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_alloc_target()
3915 list_add_tail(&tgt->queue, &vhost->targets); in ibmvfc_alloc_target()
3918 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_alloc_target()
3929 static int ibmvfc_alloc_targets(struct ibmvfc_host *vhost) in ibmvfc_alloc_targets() argument
3933 for (i = 0, rc = 0; !rc && i < vhost->num_targets; i++) in ibmvfc_alloc_targets()
3934 rc = ibmvfc_alloc_target(vhost, in ibmvfc_alloc_targets()
3935 be32_to_cpu(vhost->disc_buf->scsi_id[i]) & in ibmvfc_alloc_targets()
3948 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_discover_targets_done() local
3955 ibmvfc_dbg(vhost, "Discover Targets succeeded\n"); in ibmvfc_discover_targets_done()
3956 vhost->num_targets = be32_to_cpu(rsp->num_written); in ibmvfc_discover_targets_done()
3957 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_ALLOC_TGTS); in ibmvfc_discover_targets_done()
3960 level += ibmvfc_retry_host_init(vhost); in ibmvfc_discover_targets_done()
3961 ibmvfc_log(vhost, level, "Discover Targets failed: %s (%x:%x)\n", in ibmvfc_discover_targets_done()
3968 dev_err(vhost->dev, "Invalid Discover Targets response: 0x%x\n", mad_status); in ibmvfc_discover_targets_done()
3969 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_discover_targets_done()
3974 wake_up(&vhost->work_wait_q); in ibmvfc_discover_targets_done()
3982 static void ibmvfc_discover_targets(struct ibmvfc_host *vhost) in ibmvfc_discover_targets() argument
3985 struct ibmvfc_event *evt = ibmvfc_get_event(vhost); in ibmvfc_discover_targets()
3993 mad->bufflen = cpu_to_be32(vhost->disc_buf_sz); in ibmvfc_discover_targets()
3994 mad->buffer.va = cpu_to_be64(vhost->disc_buf_dma); in ibmvfc_discover_targets()
3995 mad->buffer.len = cpu_to_be32(vhost->disc_buf_sz); in ibmvfc_discover_targets()
3996 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT_WAIT); in ibmvfc_discover_targets()
3998 if (!ibmvfc_send_event(evt, vhost, default_timeout)) in ibmvfc_discover_targets()
3999 ibmvfc_dbg(vhost, "Sent discover targets\n"); in ibmvfc_discover_targets()
4001 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_discover_targets()
4011 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_npiv_login_done() local
4013 struct ibmvfc_npiv_login_resp *rsp = &vhost->login_buf->resp; in ibmvfc_npiv_login_done()
4023 level += ibmvfc_retry_host_init(vhost); in ibmvfc_npiv_login_done()
4025 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_npiv_login_done()
4026 ibmvfc_log(vhost, level, "NPIV Login failed: %s (%x:%x)\n", in ibmvfc_npiv_login_done()
4032 ibmvfc_retry_host_init(vhost); in ibmvfc_npiv_login_done()
4037 dev_err(vhost->dev, "Invalid NPIV Login response: 0x%x\n", mad_status); in ibmvfc_npiv_login_done()
4038 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_npiv_login_done()
4043 vhost->client_migrated = 0; in ibmvfc_npiv_login_done()
4046 dev_err(vhost->dev, "Virtual adapter does not support FC. %x\n", in ibmvfc_npiv_login_done()
4048 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_npiv_login_done()
4049 wake_up(&vhost->work_wait_q); in ibmvfc_npiv_login_done()
4054 dev_err(vhost->dev, "Virtual adapter supported queue depth too small: %d\n", in ibmvfc_npiv_login_done()
4056 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_npiv_login_done()
4057 wake_up(&vhost->work_wait_q); in ibmvfc_npiv_login_done()
4061 vhost->logged_in = 1; in ibmvfc_npiv_login_done()
4063 dev_info(vhost->dev, "Host partition: %s, device: %s %s %s max sectors %u\n", in ibmvfc_npiv_login_done()
4067 fc_host_fabric_name(vhost->host) = be64_to_cpu(rsp->node_name); in ibmvfc_npiv_login_done()
4068 fc_host_node_name(vhost->host) = be64_to_cpu(rsp->node_name); in ibmvfc_npiv_login_done()
4069 fc_host_port_name(vhost->host) = be64_to_cpu(rsp->port_name); in ibmvfc_npiv_login_done()
4070 fc_host_port_id(vhost->host) = be64_to_cpu(rsp->scsi_id); in ibmvfc_npiv_login_done()
4071 fc_host_port_type(vhost->host) = FC_PORTTYPE_NPIV; in ibmvfc_npiv_login_done()
4072 fc_host_supported_classes(vhost->host) = 0; in ibmvfc_npiv_login_done()
4074 fc_host_supported_classes(vhost->host) |= FC_COS_CLASS1; in ibmvfc_npiv_login_done()
4076 fc_host_supported_classes(vhost->host) |= FC_COS_CLASS2; in ibmvfc_npiv_login_done()
4078 fc_host_supported_classes(vhost->host) |= FC_COS_CLASS3; in ibmvfc_npiv_login_done()
4079 fc_host_maxframe_size(vhost->host) = in ibmvfc_npiv_login_done()
4082 vhost->host->can_queue = be32_to_cpu(rsp->max_cmds) - IBMVFC_NUM_INTERNAL_REQ; in ibmvfc_npiv_login_done()
4083 vhost->host->max_sectors = npiv_max_sectors; in ibmvfc_npiv_login_done()
4084 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY); in ibmvfc_npiv_login_done()
4085 wake_up(&vhost->work_wait_q); in ibmvfc_npiv_login_done()
4093 static void ibmvfc_npiv_login(struct ibmvfc_host *vhost) in ibmvfc_npiv_login() argument
4096 struct ibmvfc_event *evt = ibmvfc_get_event(vhost); in ibmvfc_npiv_login()
4098 ibmvfc_gather_partition_info(vhost); in ibmvfc_npiv_login()
4099 ibmvfc_set_login_info(vhost); in ibmvfc_npiv_login()
4102 memcpy(vhost->login_buf, &vhost->login_info, sizeof(vhost->login_info)); in ibmvfc_npiv_login()
4108 mad->buffer.va = cpu_to_be64(vhost->login_buf_dma); in ibmvfc_npiv_login()
4109 mad->buffer.len = cpu_to_be32(sizeof(*vhost->login_buf)); in ibmvfc_npiv_login()
4111 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT_WAIT); in ibmvfc_npiv_login()
4113 if (!ibmvfc_send_event(evt, vhost, default_timeout)) in ibmvfc_npiv_login()
4114 ibmvfc_dbg(vhost, "Sent NPIV login\n"); in ibmvfc_npiv_login()
4116 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_npiv_login()
4126 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_npiv_logout_done() local
4133 if (list_empty(&vhost->sent) && in ibmvfc_npiv_logout_done()
4134 vhost->action == IBMVFC_HOST_ACTION_LOGO_WAIT) { in ibmvfc_npiv_logout_done()
4135 ibmvfc_init_host(vhost); in ibmvfc_npiv_logout_done()
4144 ibmvfc_dbg(vhost, "NPIV Logout failed. 0x%X\n", mad_status); in ibmvfc_npiv_logout_done()
4148 ibmvfc_hard_reset_host(vhost); in ibmvfc_npiv_logout_done()
4156 static void ibmvfc_npiv_logout(struct ibmvfc_host *vhost) in ibmvfc_npiv_logout() argument
4161 evt = ibmvfc_get_event(vhost); in ibmvfc_npiv_logout()
4170 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_LOGO_WAIT); in ibmvfc_npiv_logout()
4172 if (!ibmvfc_send_event(evt, vhost, default_timeout)) in ibmvfc_npiv_logout()
4173 ibmvfc_dbg(vhost, "Sent NPIV logout\n"); in ibmvfc_npiv_logout()
4175 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_npiv_logout()
4185 static int ibmvfc_dev_init_to_do(struct ibmvfc_host *vhost) in ibmvfc_dev_init_to_do() argument
4189 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_dev_init_to_do()
4205 static int __ibmvfc_work_to_do(struct ibmvfc_host *vhost) in __ibmvfc_work_to_do() argument
4211 switch (vhost->action) { in __ibmvfc_work_to_do()
4218 if (vhost->discovery_threads == disc_threads) in __ibmvfc_work_to_do()
4220 list_for_each_entry(tgt, &vhost->targets, queue) in __ibmvfc_work_to_do()
4223 list_for_each_entry(tgt, &vhost->targets, queue) in __ibmvfc_work_to_do()
4249 static int ibmvfc_work_to_do(struct ibmvfc_host *vhost) in ibmvfc_work_to_do() argument
4254 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_work_to_do()
4255 rc = __ibmvfc_work_to_do(vhost); in ibmvfc_work_to_do()
4256 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_work_to_do()
4266 static void ibmvfc_log_ae(struct ibmvfc_host *vhost, int events) in ibmvfc_log_ae() argument
4269 fc_host_post_event(vhost->host, fc_get_event_number(), FCH_EVT_RSCN, 0); in ibmvfc_log_ae()
4271 vhost->state >= IBMVFC_HALTED) in ibmvfc_log_ae()
4272 fc_host_post_event(vhost->host, fc_get_event_number(), FCH_EVT_LINKDOWN, 0); in ibmvfc_log_ae()
4274 vhost->state == IBMVFC_INITIALIZING) in ibmvfc_log_ae()
4275 fc_host_post_event(vhost->host, fc_get_event_number(), FCH_EVT_LINKUP, 0); in ibmvfc_log_ae()
4285 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_add_rport() local
4290 rport = fc_remote_port_add(vhost->host, 0, &tgt->ids); in ibmvfc_tgt_add_rport()
4291 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_tgt_add_rport()
4297 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_tgt_add_rport()
4303 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_tgt_add_rport()
4323 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_tgt_add_rport()
4331 static void ibmvfc_do_work(struct ibmvfc_host *vhost) in ibmvfc_do_work() argument
4338 ibmvfc_log_ae(vhost, vhost->events_to_log); in ibmvfc_do_work()
4339 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_do_work()
4340 vhost->events_to_log = 0; in ibmvfc_do_work()
4341 switch (vhost->action) { in ibmvfc_do_work()
4347 vhost->action = IBMVFC_HOST_ACTION_TGT_DEL; in ibmvfc_do_work()
4348 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4349 rc = ibmvfc_reset_crq(vhost); in ibmvfc_do_work()
4350 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_do_work()
4352 vio_enable_interrupts(to_vio_dev(vhost->dev)); in ibmvfc_do_work()
4353 if (rc || (rc = ibmvfc_send_crq_init(vhost)) || in ibmvfc_do_work()
4354 (rc = vio_enable_interrupts(to_vio_dev(vhost->dev)))) { in ibmvfc_do_work()
4355 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_do_work()
4356 dev_err(vhost->dev, "Error after reset (rc=%d)\n", rc); in ibmvfc_do_work()
4360 vhost->action = IBMVFC_HOST_ACTION_TGT_DEL; in ibmvfc_do_work()
4361 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4362 rc = ibmvfc_reenable_crq_queue(vhost); in ibmvfc_do_work()
4363 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_do_work()
4364 if (rc || (rc = ibmvfc_send_crq_init(vhost))) { in ibmvfc_do_work()
4365 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_do_work()
4366 dev_err(vhost->dev, "Error after enable (rc=%d)\n", rc); in ibmvfc_do_work()
4370 vhost->job_step(vhost); in ibmvfc_do_work()
4373 BUG_ON(vhost->state != IBMVFC_INITIALIZING); in ibmvfc_do_work()
4374 if (vhost->delay_init) { in ibmvfc_do_work()
4375 vhost->delay_init = 0; in ibmvfc_do_work()
4376 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4380 vhost->job_step(vhost); in ibmvfc_do_work()
4383 list_for_each_entry(tgt, &vhost->targets, queue) in ibmvfc_do_work()
4385 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY_TGTS); in ibmvfc_do_work()
4388 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_do_work()
4395 if (!ibmvfc_dev_init_to_do(vhost)) in ibmvfc_do_work()
4396 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_DEL); in ibmvfc_do_work()
4400 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_do_work()
4407 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4416 if (vhost->state == IBMVFC_INITIALIZING) { in ibmvfc_do_work()
4417 if (vhost->action == IBMVFC_HOST_ACTION_TGT_DEL_FAILED) { in ibmvfc_do_work()
4418 if (vhost->reinit) { in ibmvfc_do_work()
4419 vhost->reinit = 0; in ibmvfc_do_work()
4420 scsi_block_requests(vhost->host); in ibmvfc_do_work()
4421 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY); in ibmvfc_do_work()
4422 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4424 ibmvfc_set_host_state(vhost, IBMVFC_ACTIVE); in ibmvfc_do_work()
4425 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE); in ibmvfc_do_work()
4426 wake_up(&vhost->init_wait_q); in ibmvfc_do_work()
4427 schedule_work(&vhost->rport_add_work_q); in ibmvfc_do_work()
4428 vhost->init_retries = 0; in ibmvfc_do_work()
4429 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4430 scsi_unblock_requests(vhost->host); in ibmvfc_do_work()
4435 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT); in ibmvfc_do_work()
4436 vhost->job_step = ibmvfc_discover_targets; in ibmvfc_do_work()
4439 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE); in ibmvfc_do_work()
4440 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4441 scsi_unblock_requests(vhost->host); in ibmvfc_do_work()
4442 wake_up(&vhost->init_wait_q); in ibmvfc_do_work()
4447 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_INIT); in ibmvfc_do_work()
4448 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4449 ibmvfc_alloc_targets(vhost); in ibmvfc_do_work()
4450 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_do_work()
4453 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_do_work()
4460 if (!ibmvfc_dev_init_to_do(vhost)) in ibmvfc_do_work()
4461 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_DEL_FAILED); in ibmvfc_do_work()
4467 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4479 struct ibmvfc_host *vhost = data; in ibmvfc_work() local
4485 rc = wait_event_interruptible(vhost->work_wait_q, in ibmvfc_work()
4486 ibmvfc_work_to_do(vhost)); in ibmvfc_work()
4493 ibmvfc_do_work(vhost); in ibmvfc_work()
4496 ibmvfc_dbg(vhost, "ibmvfc kthread exiting...\n"); in ibmvfc_work()
4510 static int ibmvfc_init_crq(struct ibmvfc_host *vhost) in ibmvfc_init_crq() argument
4513 struct device *dev = vhost->dev; in ibmvfc_init_crq()
4515 struct ibmvfc_crq_queue *crq = &vhost->crq; in ibmvfc_init_crq()
4535 retrc = rc = ibmvfc_reset_crq(vhost); in ibmvfc_init_crq()
4546 tasklet_init(&vhost->tasklet, (void *)ibmvfc_tasklet, (unsigned long)vhost); in ibmvfc_init_crq()
4548 if ((rc = request_irq(vdev->irq, ibmvfc_interrupt, 0, IBMVFC_NAME, vhost))) { in ibmvfc_init_crq()
4563 tasklet_kill(&vhost->tasklet); in ibmvfc_init_crq()
4581 static void ibmvfc_free_mem(struct ibmvfc_host *vhost) in ibmvfc_free_mem() argument
4583 struct ibmvfc_async_crq_queue *async_q = &vhost->async_crq; in ibmvfc_free_mem()
4586 mempool_destroy(vhost->tgt_pool); in ibmvfc_free_mem()
4587 kfree(vhost->trace); in ibmvfc_free_mem()
4588 dma_free_coherent(vhost->dev, vhost->disc_buf_sz, vhost->disc_buf, in ibmvfc_free_mem()
4589 vhost->disc_buf_dma); in ibmvfc_free_mem()
4590 dma_free_coherent(vhost->dev, sizeof(*vhost->login_buf), in ibmvfc_free_mem()
4591 vhost->login_buf, vhost->login_buf_dma); in ibmvfc_free_mem()
4592 dma_pool_destroy(vhost->sg_pool); in ibmvfc_free_mem()
4593 dma_unmap_single(vhost->dev, async_q->msg_token, in ibmvfc_free_mem()
4606 static int ibmvfc_alloc_mem(struct ibmvfc_host *vhost) in ibmvfc_alloc_mem() argument
4608 struct ibmvfc_async_crq_queue *async_q = &vhost->async_crq; in ibmvfc_alloc_mem()
4609 struct device *dev = vhost->dev; in ibmvfc_alloc_mem()
4628 vhost->sg_pool = dma_pool_create(IBMVFC_NAME, dev, in ibmvfc_alloc_mem()
4632 if (!vhost->sg_pool) { in ibmvfc_alloc_mem()
4637 vhost->login_buf = dma_alloc_coherent(dev, sizeof(*vhost->login_buf), in ibmvfc_alloc_mem()
4638 &vhost->login_buf_dma, GFP_KERNEL); in ibmvfc_alloc_mem()
4640 if (!vhost->login_buf) { in ibmvfc_alloc_mem()
4645 vhost->disc_buf_sz = sizeof(vhost->disc_buf->scsi_id[0]) * max_targets; in ibmvfc_alloc_mem()
4646 vhost->disc_buf = dma_alloc_coherent(dev, vhost->disc_buf_sz, in ibmvfc_alloc_mem()
4647 &vhost->disc_buf_dma, GFP_KERNEL); in ibmvfc_alloc_mem()
4649 if (!vhost->disc_buf) { in ibmvfc_alloc_mem()
4654 vhost->trace = kcalloc(IBMVFC_NUM_TRACE_ENTRIES, in ibmvfc_alloc_mem()
4657 if (!vhost->trace) in ibmvfc_alloc_mem()
4660 vhost->tgt_pool = mempool_create_kmalloc_pool(IBMVFC_TGT_MEMPOOL_SZ, in ibmvfc_alloc_mem()
4663 if (!vhost->tgt_pool) { in ibmvfc_alloc_mem()
4672 kfree(vhost->trace); in ibmvfc_alloc_mem()
4674 dma_free_coherent(dev, vhost->disc_buf_sz, vhost->disc_buf, in ibmvfc_alloc_mem()
4675 vhost->disc_buf_dma); in ibmvfc_alloc_mem()
4677 dma_free_coherent(dev, sizeof(*vhost->login_buf), in ibmvfc_alloc_mem()
4678 vhost->login_buf, vhost->login_buf_dma); in ibmvfc_alloc_mem()
4680 dma_pool_destroy(vhost->sg_pool); in ibmvfc_alloc_mem()
4698 struct ibmvfc_host *vhost = container_of(work, struct ibmvfc_host, in ibmvfc_rport_add_thread() local
4706 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_rport_add_thread()
4709 if (vhost->state != IBMVFC_ACTIVE) in ibmvfc_rport_add_thread()
4712 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_rport_add_thread()
4719 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_rport_add_thread()
4722 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_rport_add_thread()
4727 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_rport_add_thread()
4731 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_rport_add_thread()
4737 if (vhost->state == IBMVFC_ACTIVE) in ibmvfc_rport_add_thread()
4738 vhost->scan_complete = 1; in ibmvfc_rport_add_thread()
4739 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_rport_add_thread()
4753 struct ibmvfc_host *vhost; in ibmvfc_probe() local
4759 shost = scsi_host_alloc(&driver_template, sizeof(*vhost)); in ibmvfc_probe()
4773 vhost = shost_priv(shost); in ibmvfc_probe()
4774 INIT_LIST_HEAD(&vhost->sent); in ibmvfc_probe()
4775 INIT_LIST_HEAD(&vhost->free); in ibmvfc_probe()
4776 INIT_LIST_HEAD(&vhost->targets); in ibmvfc_probe()
4777 sprintf(vhost->name, IBMVFC_NAME); in ibmvfc_probe()
4778 vhost->host = shost; in ibmvfc_probe()
4779 vhost->dev = dev; in ibmvfc_probe()
4780 vhost->partition_number = -1; in ibmvfc_probe()
4781 vhost->log_level = log_level; in ibmvfc_probe()
4782 vhost->task_set = 1; in ibmvfc_probe()
4783 strcpy(vhost->partition_name, "UNKNOWN"); in ibmvfc_probe()
4784 init_waitqueue_head(&vhost->work_wait_q); in ibmvfc_probe()
4785 init_waitqueue_head(&vhost->init_wait_q); in ibmvfc_probe()
4786 INIT_WORK(&vhost->rport_add_work_q, ibmvfc_rport_add_thread); in ibmvfc_probe()
4787 mutex_init(&vhost->passthru_mutex); in ibmvfc_probe()
4789 if ((rc = ibmvfc_alloc_mem(vhost))) in ibmvfc_probe()
4792 vhost->work_thread = kthread_run(ibmvfc_work, vhost, "%s_%d", IBMVFC_NAME, in ibmvfc_probe()
4795 if (IS_ERR(vhost->work_thread)) { in ibmvfc_probe()
4797 PTR_ERR(vhost->work_thread)); in ibmvfc_probe()
4801 if ((rc = ibmvfc_init_crq(vhost))) { in ibmvfc_probe()
4806 if ((rc = ibmvfc_init_event_pool(vhost))) { in ibmvfc_probe()
4824 dev_set_drvdata(dev, vhost); in ibmvfc_probe()
4826 list_add_tail(&vhost->queue, &ibmvfc_head); in ibmvfc_probe()
4829 ibmvfc_send_crq_init(vhost); in ibmvfc_probe()
4836 ibmvfc_free_event_pool(vhost); in ibmvfc_probe()
4838 ibmvfc_release_crq_queue(vhost); in ibmvfc_probe()
4840 kthread_stop(vhost->work_thread); in ibmvfc_probe()
4842 ibmvfc_free_mem(vhost); in ibmvfc_probe()
4859 struct ibmvfc_host *vhost = dev_get_drvdata(&vdev->dev); in ibmvfc_remove() local
4863 ibmvfc_remove_trace_file(&vhost->host->shost_dev.kobj, &ibmvfc_trace_attr); in ibmvfc_remove()
4865 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_remove()
4866 ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE); in ibmvfc_remove()
4867 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_remove()
4869 ibmvfc_wait_while_resetting(vhost); in ibmvfc_remove()
4870 ibmvfc_release_crq_queue(vhost); in ibmvfc_remove()
4871 kthread_stop(vhost->work_thread); in ibmvfc_remove()
4872 fc_remove_host(vhost->host); in ibmvfc_remove()
4873 scsi_remove_host(vhost->host); in ibmvfc_remove()
4875 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_remove()
4876 ibmvfc_purge_requests(vhost, DID_ERROR); in ibmvfc_remove()
4877 ibmvfc_free_event_pool(vhost); in ibmvfc_remove()
4878 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_remove()
4880 ibmvfc_free_mem(vhost); in ibmvfc_remove()
4882 list_del(&vhost->queue); in ibmvfc_remove()
4884 scsi_host_put(vhost->host); in ibmvfc_remove()
4900 struct ibmvfc_host *vhost = dev_get_drvdata(dev); in ibmvfc_resume() local
4903 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_resume()
4905 tasklet_schedule(&vhost->tasklet); in ibmvfc_resume()
4906 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_resume()