Lines Matching refs:vhost

149 	struct ibmvfc_host *vhost = evt->vhost;  in ibmvfc_trc_start()  local
154 entry = &vhost->trace[vhost->trace_index++]; in ibmvfc_trc_start()
183 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_trc_end() local
186 struct ibmvfc_trace_entry *entry = &vhost->trace[vhost->trace_index++]; in ibmvfc_trc_end()
481 static int ibmvfc_set_host_state(struct ibmvfc_host *vhost, in ibmvfc_set_host_state() argument
486 switch (vhost->state) { in ibmvfc_set_host_state()
491 vhost->state = state; in ibmvfc_set_host_state()
504 static void ibmvfc_set_host_action(struct ibmvfc_host *vhost, in ibmvfc_set_host_action() argument
509 if (vhost->action == IBMVFC_HOST_ACTION_INIT_WAIT) in ibmvfc_set_host_action()
510 vhost->action = action; in ibmvfc_set_host_action()
513 if (vhost->action == IBMVFC_HOST_ACTION_LOGO) in ibmvfc_set_host_action()
514 vhost->action = action; in ibmvfc_set_host_action()
517 if (vhost->action == IBMVFC_HOST_ACTION_INIT) in ibmvfc_set_host_action()
518 vhost->action = action; in ibmvfc_set_host_action()
521 switch (vhost->action) { in ibmvfc_set_host_action()
525 vhost->action = action; in ibmvfc_set_host_action()
532 if (vhost->action == IBMVFC_HOST_ACTION_ALLOC_TGTS) in ibmvfc_set_host_action()
533 vhost->action = action; in ibmvfc_set_host_action()
537 vhost->action = action; in ibmvfc_set_host_action()
546 switch (vhost->action) { in ibmvfc_set_host_action()
551 vhost->action = action; in ibmvfc_set_host_action()
565 static void ibmvfc_reinit_host(struct ibmvfc_host *vhost) in ibmvfc_reinit_host() argument
567 if (vhost->action == IBMVFC_HOST_ACTION_NONE && in ibmvfc_reinit_host()
568 vhost->state == IBMVFC_ACTIVE) { in ibmvfc_reinit_host()
569 if (!ibmvfc_set_host_state(vhost, IBMVFC_INITIALIZING)) { in ibmvfc_reinit_host()
570 scsi_block_requests(vhost->host); in ibmvfc_reinit_host()
571 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY); in ibmvfc_reinit_host()
574 vhost->reinit = 1; in ibmvfc_reinit_host()
576 wake_up(&vhost->work_wait_q); in ibmvfc_reinit_host()
589 wake_up(&tgt->vhost->work_wait_q); in ibmvfc_del_tgt()
598 static void ibmvfc_link_down(struct ibmvfc_host *vhost, in ibmvfc_link_down() argument
604 scsi_block_requests(vhost->host); in ibmvfc_link_down()
605 list_for_each_entry(tgt, &vhost->targets, queue) in ibmvfc_link_down()
607 ibmvfc_set_host_state(vhost, state); in ibmvfc_link_down()
608 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_DEL); in ibmvfc_link_down()
609 vhost->events_to_log |= IBMVFC_AE_LINKDOWN; in ibmvfc_link_down()
610 wake_up(&vhost->work_wait_q); in ibmvfc_link_down()
621 static void ibmvfc_init_host(struct ibmvfc_host *vhost) in ibmvfc_init_host() argument
625 if (vhost->action == IBMVFC_HOST_ACTION_INIT_WAIT) { in ibmvfc_init_host()
626 if (++vhost->init_retries > IBMVFC_MAX_HOST_INIT_RETRIES) { in ibmvfc_init_host()
627 dev_err(vhost->dev, in ibmvfc_init_host()
629 ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE); in ibmvfc_init_host()
634 if (!ibmvfc_set_host_state(vhost, IBMVFC_INITIALIZING)) { in ibmvfc_init_host()
635 memset(vhost->async_crq.msgs, 0, PAGE_SIZE); in ibmvfc_init_host()
636 vhost->async_crq.cur = 0; in ibmvfc_init_host()
638 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_init_host()
639 if (vhost->client_migrated) in ibmvfc_init_host()
645 scsi_block_requests(vhost->host); in ibmvfc_init_host()
646 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT); in ibmvfc_init_host()
647 vhost->job_step = ibmvfc_npiv_login; in ibmvfc_init_host()
648 wake_up(&vhost->work_wait_q); in ibmvfc_init_host()
661 static int ibmvfc_send_crq(struct ibmvfc_host *vhost, u64 word1, u64 word2) in ibmvfc_send_crq() argument
663 struct vio_dev *vdev = to_vio_dev(vhost->dev); in ibmvfc_send_crq()
674 static int ibmvfc_send_crq_init(struct ibmvfc_host *vhost) in ibmvfc_send_crq_init() argument
676 ibmvfc_dbg(vhost, "Sending CRQ init\n"); in ibmvfc_send_crq_init()
677 return ibmvfc_send_crq(vhost, 0xC001000000000000LL, 0); in ibmvfc_send_crq_init()
687 static int ibmvfc_send_crq_init_complete(struct ibmvfc_host *vhost) in ibmvfc_send_crq_init_complete() argument
689 ibmvfc_dbg(vhost, "Sending CRQ init complete\n"); in ibmvfc_send_crq_init_complete()
690 return ibmvfc_send_crq(vhost, 0xC002000000000000LL, 0); in ibmvfc_send_crq_init_complete()
700 static void ibmvfc_release_crq_queue(struct ibmvfc_host *vhost) in ibmvfc_release_crq_queue() argument
703 struct vio_dev *vdev = to_vio_dev(vhost->dev); in ibmvfc_release_crq_queue()
704 struct ibmvfc_crq_queue *crq = &vhost->crq; in ibmvfc_release_crq_queue()
706 ibmvfc_dbg(vhost, "Releasing CRQ\n"); in ibmvfc_release_crq_queue()
707 free_irq(vdev->irq, vhost); in ibmvfc_release_crq_queue()
708 tasklet_kill(&vhost->tasklet); in ibmvfc_release_crq_queue()
715 vhost->state = IBMVFC_NO_CRQ; in ibmvfc_release_crq_queue()
716 vhost->logged_in = 0; in ibmvfc_release_crq_queue()
717 dma_unmap_single(vhost->dev, crq->msg_token, PAGE_SIZE, DMA_BIDIRECTIONAL); in ibmvfc_release_crq_queue()
728 static int ibmvfc_reenable_crq_queue(struct ibmvfc_host *vhost) in ibmvfc_reenable_crq_queue() argument
731 struct vio_dev *vdev = to_vio_dev(vhost->dev); in ibmvfc_reenable_crq_queue()
741 dev_err(vhost->dev, "Error enabling adapter (rc=%d)\n", rc); in ibmvfc_reenable_crq_queue()
753 static int ibmvfc_reset_crq(struct ibmvfc_host *vhost) in ibmvfc_reset_crq() argument
757 struct vio_dev *vdev = to_vio_dev(vhost->dev); in ibmvfc_reset_crq()
758 struct ibmvfc_crq_queue *crq = &vhost->crq; in ibmvfc_reset_crq()
767 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_reset_crq()
768 vhost->state = IBMVFC_NO_CRQ; in ibmvfc_reset_crq()
769 vhost->logged_in = 0; in ibmvfc_reset_crq()
781 dev_warn(vhost->dev, "Partner adapter not ready\n"); in ibmvfc_reset_crq()
783 dev_warn(vhost->dev, "Couldn't register crq (rc=%d)\n", rc); in ibmvfc_reset_crq()
784 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_reset_crq()
815 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_free_event() local
816 struct ibmvfc_event_pool *pool = &vhost->pool; in ibmvfc_free_event()
820 list_add_tail(&evt->queue, &vhost->free); in ibmvfc_free_event()
875 static void ibmvfc_purge_requests(struct ibmvfc_host *vhost, int error_code) in ibmvfc_purge_requests() argument
879 ibmvfc_dbg(vhost, "Purging all requests\n"); in ibmvfc_purge_requests()
880 list_for_each_entry_safe(evt, pos, &vhost->sent, queue) in ibmvfc_purge_requests()
888 static void ibmvfc_hard_reset_host(struct ibmvfc_host *vhost) in ibmvfc_hard_reset_host() argument
890 ibmvfc_purge_requests(vhost, DID_ERROR); in ibmvfc_hard_reset_host()
891 ibmvfc_link_down(vhost, IBMVFC_LINK_DOWN); in ibmvfc_hard_reset_host()
892 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_RESET); in ibmvfc_hard_reset_host()
899 static void __ibmvfc_reset_host(struct ibmvfc_host *vhost) in __ibmvfc_reset_host() argument
901 if (vhost->logged_in && vhost->action != IBMVFC_HOST_ACTION_LOGO_WAIT && in __ibmvfc_reset_host()
902 !ibmvfc_set_host_state(vhost, IBMVFC_INITIALIZING)) { in __ibmvfc_reset_host()
903 scsi_block_requests(vhost->host); in __ibmvfc_reset_host()
904 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_LOGO); in __ibmvfc_reset_host()
905 vhost->job_step = ibmvfc_npiv_logout; in __ibmvfc_reset_host()
906 wake_up(&vhost->work_wait_q); in __ibmvfc_reset_host()
908 ibmvfc_hard_reset_host(vhost); in __ibmvfc_reset_host()
915 static void ibmvfc_reset_host(struct ibmvfc_host *vhost) in ibmvfc_reset_host() argument
919 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_reset_host()
920 __ibmvfc_reset_host(vhost); in ibmvfc_reset_host()
921 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_reset_host()
931 static int ibmvfc_retry_host_init(struct ibmvfc_host *vhost) in ibmvfc_retry_host_init() argument
935 if (vhost->action == IBMVFC_HOST_ACTION_INIT_WAIT) { in ibmvfc_retry_host_init()
936 vhost->delay_init = 1; in ibmvfc_retry_host_init()
937 if (++vhost->init_retries > IBMVFC_MAX_HOST_INIT_RETRIES) { in ibmvfc_retry_host_init()
938 dev_err(vhost->dev, in ibmvfc_retry_host_init()
940 ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE); in ibmvfc_retry_host_init()
941 } else if (vhost->init_retries == IBMVFC_MAX_HOST_INIT_RETRIES) in ibmvfc_retry_host_init()
942 __ibmvfc_reset_host(vhost); in ibmvfc_retry_host_init()
944 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT); in ibmvfc_retry_host_init()
949 wake_up(&vhost->work_wait_q); in ibmvfc_retry_host_init()
963 struct ibmvfc_host *vhost = shost_priv(shost); in __ibmvfc_get_target() local
966 list_for_each_entry(tgt, &vhost->targets, queue) in __ibmvfc_get_target()
1002 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_get_host_speed() local
1006 if (vhost->state == IBMVFC_ACTIVE) { in ibmvfc_get_host_speed()
1007 switch (be64_to_cpu(vhost->login_buf->resp.link_speed) / 100) { in ibmvfc_get_host_speed()
1027 ibmvfc_log(vhost, 3, "Unknown port speed: %lld Gbit\n", in ibmvfc_get_host_speed()
1028 be64_to_cpu(vhost->login_buf->resp.link_speed) / 100); in ibmvfc_get_host_speed()
1046 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_get_host_port_state() local
1050 switch (vhost->state) { in ibmvfc_get_host_port_state()
1069 ibmvfc_log(vhost, 3, "Unknown port state: %d\n", vhost->state); in ibmvfc_get_host_port_state()
1155 static int ibmvfc_wait_while_resetting(struct ibmvfc_host *vhost) in ibmvfc_wait_while_resetting() argument
1157 long timeout = wait_event_timeout(vhost->init_wait_q, in ibmvfc_wait_while_resetting()
1158 ((vhost->state == IBMVFC_ACTIVE || in ibmvfc_wait_while_resetting()
1159 vhost->state == IBMVFC_HOST_OFFLINE || in ibmvfc_wait_while_resetting()
1160 vhost->state == IBMVFC_LINK_DEAD) && in ibmvfc_wait_while_resetting()
1161 vhost->action == IBMVFC_HOST_ACTION_NONE), in ibmvfc_wait_while_resetting()
1176 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_issue_fc_host_lip() local
1178 dev_err(vhost->dev, "Initiating host LIP. Resetting connection\n"); in ibmvfc_issue_fc_host_lip()
1179 ibmvfc_reset_host(vhost); in ibmvfc_issue_fc_host_lip()
1180 return ibmvfc_wait_while_resetting(vhost); in ibmvfc_issue_fc_host_lip()
1189 static void ibmvfc_gather_partition_info(struct ibmvfc_host *vhost) in ibmvfc_gather_partition_info() argument
1201 strncpy(vhost->partition_name, name, sizeof(vhost->partition_name)); in ibmvfc_gather_partition_info()
1204 vhost->partition_number = *num; in ibmvfc_gather_partition_info()
1215 static void ibmvfc_set_login_info(struct ibmvfc_host *vhost) in ibmvfc_set_login_info() argument
1217 struct ibmvfc_npiv_login *login_info = &vhost->login_info; in ibmvfc_set_login_info()
1218 struct device_node *of_node = vhost->dev->of_node; in ibmvfc_set_login_info()
1227 login_info->partition_num = cpu_to_be32(vhost->partition_number); in ibmvfc_set_login_info()
1231 if (vhost->client_migrated) in ibmvfc_set_login_info()
1236 login_info->async.va = cpu_to_be64(vhost->async_crq.msg_token); in ibmvfc_set_login_info()
1237 login_info->async.len = cpu_to_be32(vhost->async_crq.size * sizeof(*vhost->async_crq.msgs)); in ibmvfc_set_login_info()
1238 strncpy(login_info->partition_name, vhost->partition_name, IBMVFC_MAX_NAME); in ibmvfc_set_login_info()
1240 dev_name(&vhost->host->shost_gendev), IBMVFC_MAX_NAME); in ibmvfc_set_login_info()
1243 location = location ? location : dev_name(vhost->dev); in ibmvfc_set_login_info()
1253 static int ibmvfc_init_event_pool(struct ibmvfc_host *vhost) in ibmvfc_init_event_pool() argument
1256 struct ibmvfc_event_pool *pool = &vhost->pool; in ibmvfc_init_event_pool()
1264 pool->iu_storage = dma_alloc_coherent(vhost->dev, in ibmvfc_init_event_pool()
1279 evt->vhost = vhost; in ibmvfc_init_event_pool()
1281 list_add_tail(&evt->queue, &vhost->free); in ibmvfc_init_event_pool()
1293 static void ibmvfc_free_event_pool(struct ibmvfc_host *vhost) in ibmvfc_free_event_pool() argument
1296 struct ibmvfc_event_pool *pool = &vhost->pool; in ibmvfc_free_event_pool()
1303 dma_pool_free(vhost->sg_pool, in ibmvfc_free_event_pool()
1309 dma_free_coherent(vhost->dev, in ibmvfc_free_event_pool()
1321 static struct ibmvfc_event *ibmvfc_get_event(struct ibmvfc_host *vhost) in ibmvfc_get_event() argument
1325 BUG_ON(list_empty(&vhost->free)); in ibmvfc_get_event()
1326 evt = list_entry(vhost->free.next, struct ibmvfc_event, queue); in ibmvfc_get_event()
1385 struct ibmvfc_host *vhost = dev_get_drvdata(dev); in ibmvfc_map_sg_data() local
1395 if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL) in ibmvfc_map_sg_data()
1416 evt->ext_list = dma_pool_alloc(vhost->sg_pool, GFP_ATOMIC, in ibmvfc_map_sg_data()
1421 if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL) in ibmvfc_map_sg_data()
1444 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_timeout() local
1445 dev_err(vhost->dev, "Command timed out (%p). Resetting connection\n", evt); in ibmvfc_timeout()
1446 ibmvfc_reset_host(vhost); in ibmvfc_timeout()
1458 struct ibmvfc_host *vhost, unsigned long timeout) in ibmvfc_send_event() argument
1472 list_add_tail(&evt->queue, &vhost->sent); in ibmvfc_send_event()
1482 if ((rc = ibmvfc_send_crq(vhost, be64_to_cpu(crq_as_u64[0]), in ibmvfc_send_event()
1494 dev_warn(vhost->dev, "Send warning. Receive queue closed, will retry.\n"); in ibmvfc_send_event()
1501 dev_err(vhost->dev, "Send error (rc=%d)\n", rc); in ibmvfc_send_event()
1523 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_log_error() local
1536 if (!logerr && (vhost->log_level <= (IBMVFC_DEFAULT_LOG_LEVEL + 1))) in ibmvfc_log_error()
1555 struct ibmvfc_host *vhost = shost_priv(sdev->host); in ibmvfc_relogin() local
1559 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_relogin()
1566 ibmvfc_reinit_host(vhost); in ibmvfc_relogin()
1631 static inline int ibmvfc_host_chkready(struct ibmvfc_host *vhost) in ibmvfc_host_chkready() argument
1635 switch (vhost->state) { in ibmvfc_host_chkready()
1665 struct ibmvfc_host *vhost = shost_priv(cmnd->device->host); in ibmvfc_queuecommand_lck() local
1672 unlikely((rc = ibmvfc_host_chkready(vhost)))) { in ibmvfc_queuecommand_lck()
1679 evt = ibmvfc_get_event(vhost); in ibmvfc_queuecommand_lck()
1701 if (likely(!(rc = ibmvfc_map_sg_data(cmnd, evt, vfc_cmd, vhost->dev)))) in ibmvfc_queuecommand_lck()
1702 return ibmvfc_send_event(evt, vhost, 0); in ibmvfc_queuecommand_lck()
1708 if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL) in ibmvfc_queuecommand_lck()
1740 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_bsg_timeout_done() local
1743 vhost->aborting_passthru = 0; in ibmvfc_bsg_timeout_done()
1744 dev_info(vhost->dev, "Passthru command cancelled\n"); in ibmvfc_bsg_timeout_done()
1756 struct ibmvfc_host *vhost = shost_priv(fc_bsg_to_shost(job)); in ibmvfc_bsg_timeout() local
1764 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_bsg_timeout()
1765 if (vhost->aborting_passthru || vhost->state != IBMVFC_ACTIVE) { in ibmvfc_bsg_timeout()
1766 __ibmvfc_reset_host(vhost); in ibmvfc_bsg_timeout()
1767 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_bsg_timeout()
1771 vhost->aborting_passthru = 1; in ibmvfc_bsg_timeout()
1772 evt = ibmvfc_get_event(vhost); in ibmvfc_bsg_timeout()
1783 rc = ibmvfc_send_event(evt, vhost, default_timeout); in ibmvfc_bsg_timeout()
1786 vhost->aborting_passthru = 0; in ibmvfc_bsg_timeout()
1787 dev_err(vhost->dev, "Failed to send cancel event. rc=%d\n", rc); in ibmvfc_bsg_timeout()
1790 dev_info(vhost->dev, "Cancelling passthru command to port id 0x%lx\n", in ibmvfc_bsg_timeout()
1793 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_bsg_timeout()
1807 static int ibmvfc_bsg_plogi(struct ibmvfc_host *vhost, unsigned int port_id) in ibmvfc_bsg_plogi() argument
1817 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_bsg_plogi()
1818 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_bsg_plogi()
1827 if (unlikely((rc = ibmvfc_host_chkready(vhost)))) in ibmvfc_bsg_plogi()
1830 evt = ibmvfc_get_event(vhost); in ibmvfc_bsg_plogi()
1841 rc = ibmvfc_send_event(evt, vhost, default_timeout); in ibmvfc_bsg_plogi()
1842 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_bsg_plogi()
1852 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_bsg_plogi()
1855 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_bsg_plogi()
1869 struct ibmvfc_host *vhost = shost_priv(fc_bsg_to_shost(job)); in ibmvfc_bsg_request() local
1910 if (!mutex_trylock(&vhost->passthru_mutex)) in ibmvfc_bsg_request()
1914 req_seg = dma_map_sg(vhost->dev, job->request_payload.sg_list, in ibmvfc_bsg_request()
1918 mutex_unlock(&vhost->passthru_mutex); in ibmvfc_bsg_request()
1922 rsp_seg = dma_map_sg(vhost->dev, job->reply_payload.sg_list, in ibmvfc_bsg_request()
1926 dma_unmap_sg(vhost->dev, job->request_payload.sg_list, in ibmvfc_bsg_request()
1928 mutex_unlock(&vhost->passthru_mutex); in ibmvfc_bsg_request()
1938 rc = ibmvfc_bsg_plogi(vhost, port_id); in ibmvfc_bsg_request()
1940 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_bsg_request()
1943 unlikely((rc = ibmvfc_host_chkready(vhost)))) { in ibmvfc_bsg_request()
1944 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_bsg_request()
1948 evt = ibmvfc_get_event(vhost); in ibmvfc_bsg_request()
1976 rc = ibmvfc_send_event(evt, vhost, 0); in ibmvfc_bsg_request()
1977 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_bsg_request()
1991 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_bsg_request()
1993 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_bsg_request()
1999 dma_unmap_sg(vhost->dev, job->request_payload.sg_list, in ibmvfc_bsg_request()
2001 dma_unmap_sg(vhost->dev, job->reply_payload.sg_list, in ibmvfc_bsg_request()
2003 mutex_unlock(&vhost->passthru_mutex); in ibmvfc_bsg_request()
2019 struct ibmvfc_host *vhost = shost_priv(sdev->host); in ibmvfc_reset_device() local
2029 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_reset_device()
2030 if (vhost->state == IBMVFC_ACTIVE) { in ibmvfc_reset_device()
2031 evt = ibmvfc_get_event(vhost); in ibmvfc_reset_device()
2049 rsp_rc = ibmvfc_send_event(evt, vhost, default_timeout); in ibmvfc_reset_device()
2051 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_reset_device()
2078 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_reset_device()
2080 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_reset_device()
2143 static int ibmvfc_wait_for_ops(struct ibmvfc_host *vhost, void *device, in ibmvfc_wait_for_ops() argument
2155 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_wait_for_ops()
2156 list_for_each_entry(evt, &vhost->sent, queue) { in ibmvfc_wait_for_ops()
2162 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_wait_for_ops()
2169 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_wait_for_ops()
2170 list_for_each_entry(evt, &vhost->sent, queue) { in ibmvfc_wait_for_ops()
2176 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_wait_for_ops()
2178 dev_err(vhost->dev, "Timed out waiting for aborted commands\n"); in ibmvfc_wait_for_ops()
2202 struct ibmvfc_host *vhost = shost_priv(sdev->host); in ibmvfc_cancel_all() local
2213 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_cancel_all()
2215 list_for_each_entry(evt, &vhost->sent, queue) { in ibmvfc_cancel_all()
2223 if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL) in ibmvfc_cancel_all()
2225 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_cancel_all()
2229 if (vhost->logged_in) { in ibmvfc_cancel_all()
2230 evt = ibmvfc_get_event(vhost); in ibmvfc_cancel_all()
2240 if (!(be64_to_cpu(vhost->login_buf->resp.capabilities) & IBMVFC_CAN_SUPPRESS_ABTS)) in ibmvfc_cancel_all()
2242 if (vhost->state == IBMVFC_ACTIVE) in ibmvfc_cancel_all()
2251 rsp_rc = ibmvfc_send_event(evt, vhost, default_timeout); in ibmvfc_cancel_all()
2254 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_cancel_all()
2268 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_cancel_all()
2270 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_cancel_all()
2334 struct ibmvfc_host *vhost = shost_priv(sdev->host); in ibmvfc_abort_task_set() local
2344 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_abort_task_set()
2346 list_for_each_entry(evt, &vhost->sent, queue) { in ibmvfc_abort_task_set()
2354 if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL) in ibmvfc_abort_task_set()
2356 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_abort_task_set()
2360 if (vhost->state == IBMVFC_ACTIVE) { in ibmvfc_abort_task_set()
2361 evt = ibmvfc_get_event(vhost); in ibmvfc_abort_task_set()
2379 rsp_rc = ibmvfc_send_event(evt, vhost, default_timeout); in ibmvfc_abort_task_set()
2382 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_abort_task_set()
2395 rc = ibmvfc_wait_for_ops(vhost, sdev->hostdata, ibmvfc_match_key); in ibmvfc_abort_task_set()
2402 ibmvfc_reset_host(vhost); in ibmvfc_abort_task_set()
2404 rc = ibmvfc_wait_for_ops(vhost, sdev->hostdata, ibmvfc_match_key); in ibmvfc_abort_task_set()
2409 rc = ibmvfc_wait_for_ops(vhost, evt, ibmvfc_match_evt); in ibmvfc_abort_task_set()
2411 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_abort_task_set()
2412 ibmvfc_hard_reset_host(vhost); in ibmvfc_abort_task_set()
2413 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_abort_task_set()
2438 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_abort_task_set()
2440 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_abort_task_set()
2454 struct ibmvfc_host *vhost = shost_priv(sdev->host); in ibmvfc_eh_abort_handler() local
2460 ibmvfc_wait_while_resetting(vhost); in ibmvfc_eh_abort_handler()
2468 rc = ibmvfc_wait_for_ops(vhost, sdev, ibmvfc_match_lun); in ibmvfc_eh_abort_handler()
2487 struct ibmvfc_host *vhost = shost_priv(sdev->host); in ibmvfc_eh_device_reset_handler() local
2493 ibmvfc_wait_while_resetting(vhost); in ibmvfc_eh_device_reset_handler()
2501 rc = ibmvfc_wait_for_ops(vhost, sdev, ibmvfc_match_lun); in ibmvfc_eh_device_reset_handler()
2544 struct ibmvfc_host *vhost = shost_priv(sdev->host); in ibmvfc_eh_target_reset_handler() local
2553 ibmvfc_wait_while_resetting(vhost); in ibmvfc_eh_target_reset_handler()
2561 rc = ibmvfc_wait_for_ops(vhost, starget, ibmvfc_match_target); in ibmvfc_eh_target_reset_handler()
2578 struct ibmvfc_host *vhost = shost_priv(cmd->device->host); in ibmvfc_eh_host_reset_handler() local
2580 dev_err(vhost->dev, "Resetting connection due to error recovery\n"); in ibmvfc_eh_host_reset_handler()
2581 rc = ibmvfc_issue_fc_host_lip(vhost->host); in ibmvfc_eh_host_reset_handler()
2596 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_terminate_rport_io() local
2611 rc = ibmvfc_wait_for_ops(vhost, rport, ibmvfc_match_rport); in ibmvfc_terminate_rport_io()
2618 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_terminate_rport_io()
2632 ibmvfc_reinit_host(vhost); in ibmvfc_terminate_rport_io()
2708 struct ibmvfc_host *vhost) in ibmvfc_handle_async() argument
2713 ibmvfc_log(vhost, desc->log_level, "%s event received. scsi_id: %llx, wwpn: %llx," in ibmvfc_handle_async()
2722 ibmvfc_link_down(vhost, IBMVFC_LINK_DOWN); in ibmvfc_handle_async()
2725 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_handle_async()
2730 vhost->events_to_log |= IBMVFC_AE_LINKUP; in ibmvfc_handle_async()
2731 vhost->delay_init = 1; in ibmvfc_handle_async()
2732 __ibmvfc_reset_host(vhost); in ibmvfc_handle_async()
2738 vhost->events_to_log |= IBMVFC_AE_LINKUP; in ibmvfc_handle_async()
2739 vhost->delay_init = 1; in ibmvfc_handle_async()
2740 __ibmvfc_reset_host(vhost); in ibmvfc_handle_async()
2744 vhost->events_to_log |= IBMVFC_AE_RSCN; in ibmvfc_handle_async()
2745 if (vhost->state < IBMVFC_HALTED) { in ibmvfc_handle_async()
2746 vhost->delay_init = 1; in ibmvfc_handle_async()
2747 __ibmvfc_reset_host(vhost); in ibmvfc_handle_async()
2752 vhost->events_to_log |= IBMVFC_AE_RSCN; in ibmvfc_handle_async()
2753 ibmvfc_reinit_host(vhost); in ibmvfc_handle_async()
2758 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_handle_async()
2771 ibmvfc_reinit_host(vhost); in ibmvfc_handle_async()
2777 ibmvfc_link_down(vhost, IBMVFC_LINK_DOWN); in ibmvfc_handle_async()
2780 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_handle_async()
2783 ibmvfc_link_down(vhost, IBMVFC_HALTED); in ibmvfc_handle_async()
2786 dev_err(vhost->dev, "Unknown async event received: %lld\n", crq->event); in ibmvfc_handle_async()
2797 static void ibmvfc_handle_crq(struct ibmvfc_crq *crq, struct ibmvfc_host *vhost) in ibmvfc_handle_crq() argument
2806 dev_info(vhost->dev, "Partner initialized\n"); in ibmvfc_handle_crq()
2808 rc = ibmvfc_send_crq_init_complete(vhost); in ibmvfc_handle_crq()
2810 ibmvfc_init_host(vhost); in ibmvfc_handle_crq()
2812 dev_err(vhost->dev, "Unable to send init rsp. rc=%ld\n", rc); in ibmvfc_handle_crq()
2815 dev_info(vhost->dev, "Partner initialization complete\n"); in ibmvfc_handle_crq()
2816 ibmvfc_init_host(vhost); in ibmvfc_handle_crq()
2819 dev_err(vhost->dev, "Unknown crq message type: %d\n", crq->format); in ibmvfc_handle_crq()
2823 vhost->state = IBMVFC_NO_CRQ; in ibmvfc_handle_crq()
2824 vhost->logged_in = 0; in ibmvfc_handle_crq()
2825 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE); in ibmvfc_handle_crq()
2828 dev_info(vhost->dev, "Partition migrated, Re-enabling adapter\n"); in ibmvfc_handle_crq()
2829 vhost->client_migrated = 1; in ibmvfc_handle_crq()
2831 scsi_block_requests(vhost->host); in ibmvfc_handle_crq()
2832 ibmvfc_purge_requests(vhost, DID_REQUEUE); in ibmvfc_handle_crq()
2833 ibmvfc_set_host_state(vhost, IBMVFC_LINK_DOWN); in ibmvfc_handle_crq()
2834 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_REENABLE); in ibmvfc_handle_crq()
2835 wake_up(&vhost->work_wait_q); in ibmvfc_handle_crq()
2837 dev_err(vhost->dev, "Host partner adapter deregistered or failed (rc=%d)\n", crq->format); in ibmvfc_handle_crq()
2838 ibmvfc_purge_requests(vhost, DID_ERROR); in ibmvfc_handle_crq()
2839 ibmvfc_link_down(vhost, IBMVFC_LINK_DOWN); in ibmvfc_handle_crq()
2840 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_RESET); in ibmvfc_handle_crq()
2842 dev_err(vhost->dev, "Received unknown transport event from partner (rc=%d)\n", crq->format); in ibmvfc_handle_crq()
2848 dev_err(vhost->dev, "Got an invalid message type 0x%02x\n", crq->valid); in ibmvfc_handle_crq()
2859 if (unlikely(!ibmvfc_valid_event(&vhost->pool, evt))) { in ibmvfc_handle_crq()
2860 dev_err(vhost->dev, "Returned correlation_token 0x%08llx is invalid!\n", in ibmvfc_handle_crq()
2866 dev_err(vhost->dev, "Received duplicate correlation_token 0x%08llx!\n", in ibmvfc_handle_crq()
2888 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_scan_finished() local
2893 dev_info(vhost->dev, "Scan taking longer than %d seconds, " in ibmvfc_scan_finished()
2898 if (vhost->scan_complete) in ibmvfc_scan_finished()
2918 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_slave_alloc() local
2925 sdev->hostdata = (void *)(unsigned long)vhost->task_set++; in ibmvfc_slave_alloc()
2943 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_target_alloc() local
2947 starget->hostdata = (void *)(unsigned long)vhost->task_set++; in ibmvfc_target_alloc()
2997 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_show_host_partition_name() local
3000 vhost->login_buf->resp.partition_name); in ibmvfc_show_host_partition_name()
3007 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_show_host_device_name() local
3010 vhost->login_buf->resp.device_name); in ibmvfc_show_host_device_name()
3017 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_show_host_loc_code() local
3020 vhost->login_buf->resp.port_loc_code); in ibmvfc_show_host_loc_code()
3027 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_show_host_drc_name() local
3030 vhost->login_buf->resp.drc_name); in ibmvfc_show_host_drc_name()
3037 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_show_host_npiv_version() local
3038 return snprintf(buf, PAGE_SIZE, "%d\n", vhost->login_buf->resp.version); in ibmvfc_show_host_npiv_version()
3045 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_show_host_capabilities() local
3046 return snprintf(buf, PAGE_SIZE, "%llx\n", vhost->login_buf->resp.capabilities); in ibmvfc_show_host_capabilities()
3061 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_show_log_level() local
3066 len = snprintf(buf, PAGE_SIZE, "%d\n", vhost->log_level); in ibmvfc_show_log_level()
3084 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_store_log_level() local
3088 vhost->log_level = simple_strtoul(buf, NULL, 10); in ibmvfc_store_log_level()
3121 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_read_trace() local
3124 char *src = (char *)vhost->trace; in ibmvfc_read_trace()
3191 static struct ibmvfc_async_crq *ibmvfc_next_async_crq(struct ibmvfc_host *vhost) in ibmvfc_next_async_crq() argument
3193 struct ibmvfc_async_crq_queue *async_crq = &vhost->async_crq; in ibmvfc_next_async_crq()
3214 static struct ibmvfc_crq *ibmvfc_next_crq(struct ibmvfc_host *vhost) in ibmvfc_next_crq() argument
3216 struct ibmvfc_crq_queue *queue = &vhost->crq; in ibmvfc_next_crq()
3240 struct ibmvfc_host *vhost = (struct ibmvfc_host *)dev_instance; in ibmvfc_interrupt() local
3243 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_interrupt()
3244 vio_disable_interrupts(to_vio_dev(vhost->dev)); in ibmvfc_interrupt()
3245 tasklet_schedule(&vhost->tasklet); in ibmvfc_interrupt()
3246 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_interrupt()
3259 struct ibmvfc_host *vhost = data; in ibmvfc_tasklet() local
3260 struct vio_dev *vdev = to_vio_dev(vhost->dev); in ibmvfc_tasklet()
3266 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_tasklet()
3269 while ((async = ibmvfc_next_async_crq(vhost)) != NULL) { in ibmvfc_tasklet()
3270 ibmvfc_handle_async(async, vhost); in ibmvfc_tasklet()
3276 while ((crq = ibmvfc_next_crq(vhost)) != NULL) { in ibmvfc_tasklet()
3277 ibmvfc_handle_crq(crq, vhost); in ibmvfc_tasklet()
3283 if ((async = ibmvfc_next_async_crq(vhost)) != NULL) { in ibmvfc_tasklet()
3285 ibmvfc_handle_async(async, vhost); in ibmvfc_tasklet()
3288 } else if ((crq = ibmvfc_next_crq(vhost)) != NULL) { in ibmvfc_tasklet()
3290 ibmvfc_handle_crq(crq, vhost); in ibmvfc_tasklet()
3297 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_tasklet()
3311 wake_up(&tgt->vhost->work_wait_q); in ibmvfc_init_tgt()
3327 wake_up(&tgt->vhost->work_wait_q); in ibmvfc_retry_tgt_init()
3376 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_prli_done() local
3382 vhost->discovery_threads--; in ibmvfc_tgt_prli_done()
3434 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_prli_done()
3445 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_send_prli() local
3448 if (vhost->discovery_threads >= disc_threads) in ibmvfc_tgt_send_prli()
3452 evt = ibmvfc_get_event(vhost); in ibmvfc_tgt_send_prli()
3453 vhost->discovery_threads++; in ibmvfc_tgt_send_prli()
3472 if (ibmvfc_send_event(evt, vhost, default_timeout)) { in ibmvfc_tgt_send_prli()
3473 vhost->discovery_threads--; in ibmvfc_tgt_send_prli()
3488 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_plogi_done() local
3493 vhost->discovery_threads--; in ibmvfc_tgt_plogi_done()
3500 vhost->reinit = 1; in ibmvfc_tgt_plogi_done()
3535 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_plogi_done()
3546 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_send_plogi() local
3549 if (vhost->discovery_threads >= disc_threads) in ibmvfc_tgt_send_plogi()
3554 evt = ibmvfc_get_event(vhost); in ibmvfc_tgt_send_plogi()
3555 vhost->discovery_threads++; in ibmvfc_tgt_send_plogi()
3566 if (ibmvfc_send_event(evt, vhost, default_timeout)) { in ibmvfc_tgt_send_plogi()
3567 vhost->discovery_threads--; in ibmvfc_tgt_send_plogi()
3582 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_implicit_logout_done() local
3586 vhost->discovery_threads--; in ibmvfc_tgt_implicit_logout_done()
3596 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_implicit_logout_done()
3606 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_implicit_logout_done()
3620 struct ibmvfc_host *vhost = tgt->vhost; in __ibmvfc_tgt_get_implicit_logout_evt() local
3624 evt = ibmvfc_get_event(vhost); in __ibmvfc_tgt_get_implicit_logout_evt()
3643 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_implicit_logout() local
3646 if (vhost->discovery_threads >= disc_threads) in ibmvfc_tgt_implicit_logout()
3649 vhost->discovery_threads++; in ibmvfc_tgt_implicit_logout()
3654 if (ibmvfc_send_event(evt, vhost, default_timeout)) { in ibmvfc_tgt_implicit_logout()
3655 vhost->discovery_threads--; in ibmvfc_tgt_implicit_logout()
3670 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_implicit_logout_and_del_done() local
3674 vhost->discovery_threads--; in ibmvfc_tgt_implicit_logout_and_del_done()
3684 if (status == IBMVFC_MAD_SUCCESS || vhost->state == IBMVFC_HOST_OFFLINE) in ibmvfc_tgt_implicit_logout_and_del_done()
3691 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_implicit_logout_and_del_done()
3701 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_implicit_logout_and_del() local
3704 if (!vhost->logged_in) { in ibmvfc_tgt_implicit_logout_and_del()
3709 if (vhost->discovery_threads >= disc_threads) in ibmvfc_tgt_implicit_logout_and_del()
3712 vhost->discovery_threads++; in ibmvfc_tgt_implicit_logout_and_del()
3717 if (ibmvfc_send_event(evt, vhost, default_timeout)) { in ibmvfc_tgt_implicit_logout_and_del()
3718 vhost->discovery_threads--; in ibmvfc_tgt_implicit_logout_and_del()
3733 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_move_login_done() local
3738 vhost->discovery_threads--; in ibmvfc_tgt_move_login_done()
3770 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_move_login_done()
3781 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_move_login() local
3785 if (vhost->discovery_threads >= disc_threads) in ibmvfc_tgt_move_login()
3789 evt = ibmvfc_get_event(vhost); in ibmvfc_tgt_move_login()
3790 vhost->discovery_threads++; in ibmvfc_tgt_move_login()
3805 if (ibmvfc_send_event(evt, vhost, default_timeout)) { in ibmvfc_tgt_move_login()
3806 vhost->discovery_threads--; in ibmvfc_tgt_move_login()
3841 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_adisc_done() local
3846 vhost->discovery_threads--; in ibmvfc_tgt_adisc_done()
3873 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_adisc_done()
3916 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_adisc_cancel_done() local
3920 vhost->abort_threads--; in ibmvfc_tgt_adisc_cancel_done()
3923 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_adisc_cancel_done()
3937 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_adisc_timeout() local
3944 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_adisc_timeout()
3945 if (vhost->abort_threads >= disc_threads || in ibmvfc_adisc_timeout()
3947 vhost->state != IBMVFC_INITIALIZING || in ibmvfc_adisc_timeout()
3948 vhost->action != IBMVFC_HOST_ACTION_QUERY_TGTS) { in ibmvfc_adisc_timeout()
3949 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_adisc_timeout()
3953 vhost->abort_threads++; in ibmvfc_adisc_timeout()
3955 evt = ibmvfc_get_event(vhost); in ibmvfc_adisc_timeout()
3967 rc = ibmvfc_send_event(evt, vhost, default_timeout); in ibmvfc_adisc_timeout()
3971 vhost->abort_threads--; in ibmvfc_adisc_timeout()
3973 __ibmvfc_reset_host(vhost); in ibmvfc_adisc_timeout()
3976 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_adisc_timeout()
3993 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_adisc() local
3996 if (vhost->discovery_threads >= disc_threads) in ibmvfc_tgt_adisc()
4000 evt = ibmvfc_get_event(vhost); in ibmvfc_tgt_adisc()
4001 vhost->discovery_threads++; in ibmvfc_tgt_adisc()
4012 memcpy(&mad->fc_iu.payload[2], &vhost->login_buf->resp.port_name, in ibmvfc_tgt_adisc()
4013 sizeof(vhost->login_buf->resp.port_name)); in ibmvfc_tgt_adisc()
4014 memcpy(&mad->fc_iu.payload[4], &vhost->login_buf->resp.node_name, in ibmvfc_tgt_adisc()
4015 sizeof(vhost->login_buf->resp.node_name)); in ibmvfc_tgt_adisc()
4016 mad->fc_iu.payload[6] = cpu_to_be32(be64_to_cpu(vhost->login_buf->resp.scsi_id) & 0x00ffffff); in ibmvfc_tgt_adisc()
4026 if (ibmvfc_send_event(evt, vhost, IBMVFC_ADISC_PLUS_CANCEL_TIMEOUT)) { in ibmvfc_tgt_adisc()
4027 vhost->discovery_threads--; in ibmvfc_tgt_adisc()
4043 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_query_target_done() local
4048 vhost->discovery_threads--; in ibmvfc_tgt_query_target_done()
4085 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_query_target_done()
4096 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_query_target() local
4099 if (vhost->discovery_threads >= disc_threads) in ibmvfc_tgt_query_target()
4103 evt = ibmvfc_get_event(vhost); in ibmvfc_tgt_query_target()
4104 vhost->discovery_threads++; in ibmvfc_tgt_query_target()
4115 if (ibmvfc_send_event(evt, vhost, default_timeout)) { in ibmvfc_tgt_query_target()
4116 vhost->discovery_threads--; in ibmvfc_tgt_query_target()
4131 static int ibmvfc_alloc_target(struct ibmvfc_host *vhost, in ibmvfc_alloc_target() argument
4142 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_alloc_target()
4143 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_alloc_target()
4150 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_alloc_target()
4189 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_alloc_target()
4191 tgt = mempool_alloc(vhost->tgt_pool, GFP_NOIO); in ibmvfc_alloc_target()
4195 tgt->vhost = vhost; in ibmvfc_alloc_target()
4200 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_alloc_target()
4201 tgt->cancel_key = vhost->task_set++; in ibmvfc_alloc_target()
4202 list_add_tail(&tgt->queue, &vhost->targets); in ibmvfc_alloc_target()
4205 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_alloc_target()
4216 static int ibmvfc_alloc_targets(struct ibmvfc_host *vhost) in ibmvfc_alloc_targets() argument
4220 for (i = 0, rc = 0; !rc && i < vhost->num_targets; i++) in ibmvfc_alloc_targets()
4221 rc = ibmvfc_alloc_target(vhost, &vhost->disc_buf[i]); in ibmvfc_alloc_targets()
4233 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_discover_targets_done() local
4240 ibmvfc_dbg(vhost, "Discover Targets succeeded\n"); in ibmvfc_discover_targets_done()
4241 vhost->num_targets = be32_to_cpu(rsp->num_written); in ibmvfc_discover_targets_done()
4242 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_ALLOC_TGTS); in ibmvfc_discover_targets_done()
4245 level += ibmvfc_retry_host_init(vhost); in ibmvfc_discover_targets_done()
4246 ibmvfc_log(vhost, level, "Discover Targets failed: %s (%x:%x)\n", in ibmvfc_discover_targets_done()
4253 dev_err(vhost->dev, "Invalid Discover Targets response: 0x%x\n", mad_status); in ibmvfc_discover_targets_done()
4254 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_discover_targets_done()
4259 wake_up(&vhost->work_wait_q); in ibmvfc_discover_targets_done()
4267 static void ibmvfc_discover_targets(struct ibmvfc_host *vhost) in ibmvfc_discover_targets() argument
4270 struct ibmvfc_event *evt = ibmvfc_get_event(vhost); in ibmvfc_discover_targets()
4278 mad->bufflen = cpu_to_be32(vhost->disc_buf_sz); in ibmvfc_discover_targets()
4279 mad->buffer.va = cpu_to_be64(vhost->disc_buf_dma); in ibmvfc_discover_targets()
4280 mad->buffer.len = cpu_to_be32(vhost->disc_buf_sz); in ibmvfc_discover_targets()
4282 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT_WAIT); in ibmvfc_discover_targets()
4284 if (!ibmvfc_send_event(evt, vhost, default_timeout)) in ibmvfc_discover_targets()
4285 ibmvfc_dbg(vhost, "Sent discover targets\n"); in ibmvfc_discover_targets()
4287 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_discover_targets()
4297 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_npiv_login_done() local
4299 struct ibmvfc_npiv_login_resp *rsp = &vhost->login_buf->resp; in ibmvfc_npiv_login_done()
4309 level += ibmvfc_retry_host_init(vhost); in ibmvfc_npiv_login_done()
4311 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_npiv_login_done()
4312 ibmvfc_log(vhost, level, "NPIV Login failed: %s (%x:%x)\n", in ibmvfc_npiv_login_done()
4318 ibmvfc_retry_host_init(vhost); in ibmvfc_npiv_login_done()
4324 dev_err(vhost->dev, "Invalid NPIV Login response: 0x%x\n", mad_status); in ibmvfc_npiv_login_done()
4325 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_npiv_login_done()
4330 vhost->client_migrated = 0; in ibmvfc_npiv_login_done()
4333 dev_err(vhost->dev, "Virtual adapter does not support FC. %x\n", in ibmvfc_npiv_login_done()
4335 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_npiv_login_done()
4336 wake_up(&vhost->work_wait_q); in ibmvfc_npiv_login_done()
4341 dev_err(vhost->dev, "Virtual adapter supported queue depth too small: %d\n", in ibmvfc_npiv_login_done()
4343 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_npiv_login_done()
4344 wake_up(&vhost->work_wait_q); in ibmvfc_npiv_login_done()
4348 vhost->logged_in = 1; in ibmvfc_npiv_login_done()
4350 dev_info(vhost->dev, "Host partition: %s, device: %s %s %s max sectors %u\n", in ibmvfc_npiv_login_done()
4354 fc_host_fabric_name(vhost->host) = be64_to_cpu(rsp->node_name); in ibmvfc_npiv_login_done()
4355 fc_host_node_name(vhost->host) = be64_to_cpu(rsp->node_name); in ibmvfc_npiv_login_done()
4356 fc_host_port_name(vhost->host) = be64_to_cpu(rsp->port_name); in ibmvfc_npiv_login_done()
4357 fc_host_port_id(vhost->host) = be64_to_cpu(rsp->scsi_id); in ibmvfc_npiv_login_done()
4358 fc_host_port_type(vhost->host) = FC_PORTTYPE_NPIV; in ibmvfc_npiv_login_done()
4359 fc_host_supported_classes(vhost->host) = 0; in ibmvfc_npiv_login_done()
4361 fc_host_supported_classes(vhost->host) |= FC_COS_CLASS1; in ibmvfc_npiv_login_done()
4363 fc_host_supported_classes(vhost->host) |= FC_COS_CLASS2; in ibmvfc_npiv_login_done()
4365 fc_host_supported_classes(vhost->host) |= FC_COS_CLASS3; in ibmvfc_npiv_login_done()
4366 fc_host_maxframe_size(vhost->host) = in ibmvfc_npiv_login_done()
4369 vhost->host->can_queue = be32_to_cpu(rsp->max_cmds) - IBMVFC_NUM_INTERNAL_REQ; in ibmvfc_npiv_login_done()
4370 vhost->host->max_sectors = npiv_max_sectors; in ibmvfc_npiv_login_done()
4371 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY); in ibmvfc_npiv_login_done()
4372 wake_up(&vhost->work_wait_q); in ibmvfc_npiv_login_done()
4380 static void ibmvfc_npiv_login(struct ibmvfc_host *vhost) in ibmvfc_npiv_login() argument
4383 struct ibmvfc_event *evt = ibmvfc_get_event(vhost); in ibmvfc_npiv_login()
4385 ibmvfc_gather_partition_info(vhost); in ibmvfc_npiv_login()
4386 ibmvfc_set_login_info(vhost); in ibmvfc_npiv_login()
4389 memcpy(vhost->login_buf, &vhost->login_info, sizeof(vhost->login_info)); in ibmvfc_npiv_login()
4395 mad->buffer.va = cpu_to_be64(vhost->login_buf_dma); in ibmvfc_npiv_login()
4396 mad->buffer.len = cpu_to_be32(sizeof(*vhost->login_buf)); in ibmvfc_npiv_login()
4398 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT_WAIT); in ibmvfc_npiv_login()
4400 if (!ibmvfc_send_event(evt, vhost, default_timeout)) in ibmvfc_npiv_login()
4401 ibmvfc_dbg(vhost, "Sent NPIV login\n"); in ibmvfc_npiv_login()
4403 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_npiv_login()
4413 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_npiv_logout_done() local
4420 if (list_empty(&vhost->sent) && in ibmvfc_npiv_logout_done()
4421 vhost->action == IBMVFC_HOST_ACTION_LOGO_WAIT) { in ibmvfc_npiv_logout_done()
4422 ibmvfc_init_host(vhost); in ibmvfc_npiv_logout_done()
4431 ibmvfc_dbg(vhost, "NPIV Logout failed. 0x%X\n", mad_status); in ibmvfc_npiv_logout_done()
4435 ibmvfc_hard_reset_host(vhost); in ibmvfc_npiv_logout_done()
4443 static void ibmvfc_npiv_logout(struct ibmvfc_host *vhost) in ibmvfc_npiv_logout() argument
4448 evt = ibmvfc_get_event(vhost); in ibmvfc_npiv_logout()
4457 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_LOGO_WAIT); in ibmvfc_npiv_logout()
4459 if (!ibmvfc_send_event(evt, vhost, default_timeout)) in ibmvfc_npiv_logout()
4460 ibmvfc_dbg(vhost, "Sent NPIV logout\n"); in ibmvfc_npiv_logout()
4462 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_npiv_logout()
4472 static int ibmvfc_dev_init_to_do(struct ibmvfc_host *vhost) in ibmvfc_dev_init_to_do() argument
4476 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_dev_init_to_do()
4492 static int ibmvfc_dev_logo_to_do(struct ibmvfc_host *vhost) in ibmvfc_dev_logo_to_do() argument
4496 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_dev_logo_to_do()
4511 static int __ibmvfc_work_to_do(struct ibmvfc_host *vhost) in __ibmvfc_work_to_do() argument
4517 switch (vhost->action) { in __ibmvfc_work_to_do()
4524 if (vhost->discovery_threads == disc_threads) in __ibmvfc_work_to_do()
4526 list_for_each_entry(tgt, &vhost->targets, queue) in __ibmvfc_work_to_do()
4529 list_for_each_entry(tgt, &vhost->targets, queue) in __ibmvfc_work_to_do()
4535 if (vhost->discovery_threads == disc_threads) in __ibmvfc_work_to_do()
4537 list_for_each_entry(tgt, &vhost->targets, queue) in __ibmvfc_work_to_do()
4540 list_for_each_entry(tgt, &vhost->targets, queue) in __ibmvfc_work_to_do()
4564 static int ibmvfc_work_to_do(struct ibmvfc_host *vhost) in ibmvfc_work_to_do() argument
4569 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_work_to_do()
4570 rc = __ibmvfc_work_to_do(vhost); in ibmvfc_work_to_do()
4571 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_work_to_do()
4581 static void ibmvfc_log_ae(struct ibmvfc_host *vhost, int events) in ibmvfc_log_ae() argument
4584 fc_host_post_event(vhost->host, fc_get_event_number(), FCH_EVT_RSCN, 0); in ibmvfc_log_ae()
4586 vhost->state >= IBMVFC_HALTED) in ibmvfc_log_ae()
4587 fc_host_post_event(vhost->host, fc_get_event_number(), FCH_EVT_LINKDOWN, 0); in ibmvfc_log_ae()
4589 vhost->state == IBMVFC_INITIALIZING) in ibmvfc_log_ae()
4590 fc_host_post_event(vhost->host, fc_get_event_number(), FCH_EVT_LINKUP, 0); in ibmvfc_log_ae()
4600 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_add_rport() local
4605 rport = fc_remote_port_add(vhost->host, 0, &tgt->ids); in ibmvfc_tgt_add_rport()
4606 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_tgt_add_rport()
4612 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_tgt_add_rport()
4621 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_tgt_add_rport()
4625 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_tgt_add_rport()
4645 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_tgt_add_rport()
4653 static void ibmvfc_do_work(struct ibmvfc_host *vhost) in ibmvfc_do_work() argument
4660 ibmvfc_log_ae(vhost, vhost->events_to_log); in ibmvfc_do_work()
4661 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_do_work()
4662 vhost->events_to_log = 0; in ibmvfc_do_work()
4663 switch (vhost->action) { in ibmvfc_do_work()
4669 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4670 rc = ibmvfc_reset_crq(vhost); in ibmvfc_do_work()
4672 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_do_work()
4674 vio_enable_interrupts(to_vio_dev(vhost->dev)); in ibmvfc_do_work()
4675 if (vhost->action == IBMVFC_HOST_ACTION_RESET) { in ibmvfc_do_work()
4682 vhost->action = IBMVFC_HOST_ACTION_TGT_DEL; in ibmvfc_do_work()
4684 if (rc || (rc = ibmvfc_send_crq_init(vhost)) || in ibmvfc_do_work()
4685 (rc = vio_enable_interrupts(to_vio_dev(vhost->dev)))) { in ibmvfc_do_work()
4686 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_do_work()
4687 dev_err(vhost->dev, "Error after reset (rc=%d)\n", rc); in ibmvfc_do_work()
4692 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4693 rc = ibmvfc_reenable_crq_queue(vhost); in ibmvfc_do_work()
4695 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_do_work()
4696 if (vhost->action == IBMVFC_HOST_ACTION_REENABLE) { in ibmvfc_do_work()
4703 vhost->action = IBMVFC_HOST_ACTION_TGT_DEL; in ibmvfc_do_work()
4704 if (rc || (rc = ibmvfc_send_crq_init(vhost))) { in ibmvfc_do_work()
4705 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_do_work()
4706 dev_err(vhost->dev, "Error after enable (rc=%d)\n", rc); in ibmvfc_do_work()
4711 vhost->job_step(vhost); in ibmvfc_do_work()
4714 BUG_ON(vhost->state != IBMVFC_INITIALIZING); in ibmvfc_do_work()
4715 if (vhost->delay_init) { in ibmvfc_do_work()
4716 vhost->delay_init = 0; in ibmvfc_do_work()
4717 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4721 vhost->job_step(vhost); in ibmvfc_do_work()
4724 list_for_each_entry(tgt, &vhost->targets, queue) in ibmvfc_do_work()
4726 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY_TGTS); in ibmvfc_do_work()
4729 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_do_work()
4736 if (!ibmvfc_dev_init_to_do(vhost)) in ibmvfc_do_work()
4737 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_DEL); in ibmvfc_do_work()
4741 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_do_work()
4748 if (ibmvfc_dev_logo_to_do(vhost)) { in ibmvfc_do_work()
4749 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4753 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_do_work()
4760 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4771 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4778 if (vhost->state == IBMVFC_INITIALIZING) { in ibmvfc_do_work()
4779 if (vhost->action == IBMVFC_HOST_ACTION_TGT_DEL_FAILED) { in ibmvfc_do_work()
4780 if (vhost->reinit) { in ibmvfc_do_work()
4781 vhost->reinit = 0; in ibmvfc_do_work()
4782 scsi_block_requests(vhost->host); in ibmvfc_do_work()
4783 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY); in ibmvfc_do_work()
4784 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4786 ibmvfc_set_host_state(vhost, IBMVFC_ACTIVE); in ibmvfc_do_work()
4787 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE); in ibmvfc_do_work()
4788 wake_up(&vhost->init_wait_q); in ibmvfc_do_work()
4789 schedule_work(&vhost->rport_add_work_q); in ibmvfc_do_work()
4790 vhost->init_retries = 0; in ibmvfc_do_work()
4791 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4792 scsi_unblock_requests(vhost->host); in ibmvfc_do_work()
4797 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT); in ibmvfc_do_work()
4798 vhost->job_step = ibmvfc_discover_targets; in ibmvfc_do_work()
4801 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE); in ibmvfc_do_work()
4802 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4803 scsi_unblock_requests(vhost->host); in ibmvfc_do_work()
4804 wake_up(&vhost->init_wait_q); in ibmvfc_do_work()
4809 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_INIT); in ibmvfc_do_work()
4810 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4811 ibmvfc_alloc_targets(vhost); in ibmvfc_do_work()
4812 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_do_work()
4815 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_do_work()
4822 if (!ibmvfc_dev_init_to_do(vhost)) in ibmvfc_do_work()
4823 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_DEL_FAILED); in ibmvfc_do_work()
4829 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4841 struct ibmvfc_host *vhost = data; in ibmvfc_work() local
4847 rc = wait_event_interruptible(vhost->work_wait_q, in ibmvfc_work()
4848 ibmvfc_work_to_do(vhost)); in ibmvfc_work()
4855 ibmvfc_do_work(vhost); in ibmvfc_work()
4858 ibmvfc_dbg(vhost, "ibmvfc kthread exiting...\n"); in ibmvfc_work()
4872 static int ibmvfc_init_crq(struct ibmvfc_host *vhost) in ibmvfc_init_crq() argument
4875 struct device *dev = vhost->dev; in ibmvfc_init_crq()
4877 struct ibmvfc_crq_queue *crq = &vhost->crq; in ibmvfc_init_crq()
4897 retrc = rc = ibmvfc_reset_crq(vhost); in ibmvfc_init_crq()
4908 tasklet_init(&vhost->tasklet, (void *)ibmvfc_tasklet, (unsigned long)vhost); in ibmvfc_init_crq()
4910 if ((rc = request_irq(vdev->irq, ibmvfc_interrupt, 0, IBMVFC_NAME, vhost))) { in ibmvfc_init_crq()
4925 tasklet_kill(&vhost->tasklet); in ibmvfc_init_crq()
4943 static void ibmvfc_free_mem(struct ibmvfc_host *vhost) in ibmvfc_free_mem() argument
4945 struct ibmvfc_async_crq_queue *async_q = &vhost->async_crq; in ibmvfc_free_mem()
4948 mempool_destroy(vhost->tgt_pool); in ibmvfc_free_mem()
4949 kfree(vhost->trace); in ibmvfc_free_mem()
4950 dma_free_coherent(vhost->dev, vhost->disc_buf_sz, vhost->disc_buf, in ibmvfc_free_mem()
4951 vhost->disc_buf_dma); in ibmvfc_free_mem()
4952 dma_free_coherent(vhost->dev, sizeof(*vhost->login_buf), in ibmvfc_free_mem()
4953 vhost->login_buf, vhost->login_buf_dma); in ibmvfc_free_mem()
4954 dma_pool_destroy(vhost->sg_pool); in ibmvfc_free_mem()
4955 dma_unmap_single(vhost->dev, async_q->msg_token, in ibmvfc_free_mem()
4968 static int ibmvfc_alloc_mem(struct ibmvfc_host *vhost) in ibmvfc_alloc_mem() argument
4970 struct ibmvfc_async_crq_queue *async_q = &vhost->async_crq; in ibmvfc_alloc_mem()
4971 struct device *dev = vhost->dev; in ibmvfc_alloc_mem()
4990 vhost->sg_pool = dma_pool_create(IBMVFC_NAME, dev, in ibmvfc_alloc_mem()
4994 if (!vhost->sg_pool) { in ibmvfc_alloc_mem()
4999 vhost->login_buf = dma_alloc_coherent(dev, sizeof(*vhost->login_buf), in ibmvfc_alloc_mem()
5000 &vhost->login_buf_dma, GFP_KERNEL); in ibmvfc_alloc_mem()
5002 if (!vhost->login_buf) { in ibmvfc_alloc_mem()
5007 vhost->disc_buf_sz = sizeof(*vhost->disc_buf) * max_targets; in ibmvfc_alloc_mem()
5008 vhost->disc_buf = dma_alloc_coherent(dev, vhost->disc_buf_sz, in ibmvfc_alloc_mem()
5009 &vhost->disc_buf_dma, GFP_KERNEL); in ibmvfc_alloc_mem()
5011 if (!vhost->disc_buf) { in ibmvfc_alloc_mem()
5016 vhost->trace = kcalloc(IBMVFC_NUM_TRACE_ENTRIES, in ibmvfc_alloc_mem()
5019 if (!vhost->trace) in ibmvfc_alloc_mem()
5022 vhost->tgt_pool = mempool_create_kmalloc_pool(IBMVFC_TGT_MEMPOOL_SZ, in ibmvfc_alloc_mem()
5025 if (!vhost->tgt_pool) { in ibmvfc_alloc_mem()
5034 kfree(vhost->trace); in ibmvfc_alloc_mem()
5036 dma_free_coherent(dev, vhost->disc_buf_sz, vhost->disc_buf, in ibmvfc_alloc_mem()
5037 vhost->disc_buf_dma); in ibmvfc_alloc_mem()
5039 dma_free_coherent(dev, sizeof(*vhost->login_buf), in ibmvfc_alloc_mem()
5040 vhost->login_buf, vhost->login_buf_dma); in ibmvfc_alloc_mem()
5042 dma_pool_destroy(vhost->sg_pool); in ibmvfc_alloc_mem()
5060 struct ibmvfc_host *vhost = container_of(work, struct ibmvfc_host, in ibmvfc_rport_add_thread() local
5068 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_rport_add_thread()
5071 if (vhost->state != IBMVFC_ACTIVE) in ibmvfc_rport_add_thread()
5074 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_rport_add_thread()
5081 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_rport_add_thread()
5084 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_rport_add_thread()
5089 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_rport_add_thread()
5093 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_rport_add_thread()
5099 if (vhost->state == IBMVFC_ACTIVE) in ibmvfc_rport_add_thread()
5100 vhost->scan_complete = 1; in ibmvfc_rport_add_thread()
5101 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_rport_add_thread()
5115 struct ibmvfc_host *vhost; in ibmvfc_probe() local
5121 shost = scsi_host_alloc(&driver_template, sizeof(*vhost)); in ibmvfc_probe()
5135 vhost = shost_priv(shost); in ibmvfc_probe()
5136 INIT_LIST_HEAD(&vhost->sent); in ibmvfc_probe()
5137 INIT_LIST_HEAD(&vhost->free); in ibmvfc_probe()
5138 INIT_LIST_HEAD(&vhost->targets); in ibmvfc_probe()
5139 sprintf(vhost->name, IBMVFC_NAME); in ibmvfc_probe()
5140 vhost->host = shost; in ibmvfc_probe()
5141 vhost->dev = dev; in ibmvfc_probe()
5142 vhost->partition_number = -1; in ibmvfc_probe()
5143 vhost->log_level = log_level; in ibmvfc_probe()
5144 vhost->task_set = 1; in ibmvfc_probe()
5145 strcpy(vhost->partition_name, "UNKNOWN"); in ibmvfc_probe()
5146 init_waitqueue_head(&vhost->work_wait_q); in ibmvfc_probe()
5147 init_waitqueue_head(&vhost->init_wait_q); in ibmvfc_probe()
5148 INIT_WORK(&vhost->rport_add_work_q, ibmvfc_rport_add_thread); in ibmvfc_probe()
5149 mutex_init(&vhost->passthru_mutex); in ibmvfc_probe()
5151 if ((rc = ibmvfc_alloc_mem(vhost))) in ibmvfc_probe()
5154 vhost->work_thread = kthread_run(ibmvfc_work, vhost, "%s_%d", IBMVFC_NAME, in ibmvfc_probe()
5157 if (IS_ERR(vhost->work_thread)) { in ibmvfc_probe()
5159 PTR_ERR(vhost->work_thread)); in ibmvfc_probe()
5160 rc = PTR_ERR(vhost->work_thread); in ibmvfc_probe()
5164 if ((rc = ibmvfc_init_crq(vhost))) { in ibmvfc_probe()
5169 if ((rc = ibmvfc_init_event_pool(vhost))) { in ibmvfc_probe()
5187 dev_set_drvdata(dev, vhost); in ibmvfc_probe()
5189 list_add_tail(&vhost->queue, &ibmvfc_head); in ibmvfc_probe()
5192 ibmvfc_send_crq_init(vhost); in ibmvfc_probe()
5199 ibmvfc_free_event_pool(vhost); in ibmvfc_probe()
5201 ibmvfc_release_crq_queue(vhost); in ibmvfc_probe()
5203 kthread_stop(vhost->work_thread); in ibmvfc_probe()
5205 ibmvfc_free_mem(vhost); in ibmvfc_probe()
5222 struct ibmvfc_host *vhost = dev_get_drvdata(&vdev->dev); in ibmvfc_remove() local
5226 ibmvfc_remove_trace_file(&vhost->host->shost_dev.kobj, &ibmvfc_trace_attr); in ibmvfc_remove()
5228 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_remove()
5229 ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE); in ibmvfc_remove()
5230 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_remove()
5232 ibmvfc_wait_while_resetting(vhost); in ibmvfc_remove()
5233 ibmvfc_release_crq_queue(vhost); in ibmvfc_remove()
5234 kthread_stop(vhost->work_thread); in ibmvfc_remove()
5235 fc_remove_host(vhost->host); in ibmvfc_remove()
5236 scsi_remove_host(vhost->host); in ibmvfc_remove()
5238 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_remove()
5239 ibmvfc_purge_requests(vhost, DID_ERROR); in ibmvfc_remove()
5240 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_remove()
5241 ibmvfc_free_event_pool(vhost); in ibmvfc_remove()
5243 ibmvfc_free_mem(vhost); in ibmvfc_remove()
5245 list_del(&vhost->queue); in ibmvfc_remove()
5247 scsi_host_put(vhost->host); in ibmvfc_remove()
5263 struct ibmvfc_host *vhost = dev_get_drvdata(dev); in ibmvfc_resume() local
5266 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_resume()
5268 tasklet_schedule(&vhost->tasklet); in ibmvfc_resume()
5269 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_resume()