Lines Matching refs:vhost
155 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_trc_start() local
160 entry = &vhost->trace[vhost->trace_index++]; in ibmvfc_trc_start()
189 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_trc_end() local
192 struct ibmvfc_trace_entry *entry = &vhost->trace[vhost->trace_index++]; in ibmvfc_trc_end()
450 static int ibmvfc_set_host_state(struct ibmvfc_host *vhost, in ibmvfc_set_host_state() argument
455 switch (vhost->state) { in ibmvfc_set_host_state()
460 vhost->state = state; in ibmvfc_set_host_state()
473 static void ibmvfc_set_host_action(struct ibmvfc_host *vhost, in ibmvfc_set_host_action() argument
478 if (vhost->action == IBMVFC_HOST_ACTION_INIT_WAIT) in ibmvfc_set_host_action()
479 vhost->action = action; in ibmvfc_set_host_action()
482 if (vhost->action == IBMVFC_HOST_ACTION_LOGO) in ibmvfc_set_host_action()
483 vhost->action = action; in ibmvfc_set_host_action()
486 if (vhost->action == IBMVFC_HOST_ACTION_INIT) in ibmvfc_set_host_action()
487 vhost->action = action; in ibmvfc_set_host_action()
490 switch (vhost->action) { in ibmvfc_set_host_action()
494 vhost->action = action; in ibmvfc_set_host_action()
501 if (vhost->action == IBMVFC_HOST_ACTION_ALLOC_TGTS) in ibmvfc_set_host_action()
502 vhost->action = action; in ibmvfc_set_host_action()
506 switch (vhost->action) { in ibmvfc_set_host_action()
511 vhost->action = action; in ibmvfc_set_host_action()
522 vhost->action = action; in ibmvfc_set_host_action()
534 static void ibmvfc_reinit_host(struct ibmvfc_host *vhost) in ibmvfc_reinit_host() argument
536 if (vhost->action == IBMVFC_HOST_ACTION_NONE) { in ibmvfc_reinit_host()
537 if (!ibmvfc_set_host_state(vhost, IBMVFC_INITIALIZING)) { in ibmvfc_reinit_host()
538 scsi_block_requests(vhost->host); in ibmvfc_reinit_host()
539 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY); in ibmvfc_reinit_host()
542 vhost->reinit = 1; in ibmvfc_reinit_host()
544 wake_up(&vhost->work_wait_q); in ibmvfc_reinit_host()
553 static void ibmvfc_link_down(struct ibmvfc_host *vhost, in ibmvfc_link_down() argument
559 scsi_block_requests(vhost->host); in ibmvfc_link_down()
560 list_for_each_entry(tgt, &vhost->targets, queue) in ibmvfc_link_down()
562 ibmvfc_set_host_state(vhost, state); in ibmvfc_link_down()
563 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_DEL); in ibmvfc_link_down()
564 vhost->events_to_log |= IBMVFC_AE_LINKDOWN; in ibmvfc_link_down()
565 wake_up(&vhost->work_wait_q); in ibmvfc_link_down()
576 static void ibmvfc_init_host(struct ibmvfc_host *vhost) in ibmvfc_init_host() argument
580 if (vhost->action == IBMVFC_HOST_ACTION_INIT_WAIT) { in ibmvfc_init_host()
581 if (++vhost->init_retries > IBMVFC_MAX_HOST_INIT_RETRIES) { in ibmvfc_init_host()
582 dev_err(vhost->dev, in ibmvfc_init_host()
584 ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE); in ibmvfc_init_host()
589 if (!ibmvfc_set_host_state(vhost, IBMVFC_INITIALIZING)) { in ibmvfc_init_host()
590 memset(vhost->async_crq.msgs, 0, PAGE_SIZE); in ibmvfc_init_host()
591 vhost->async_crq.cur = 0; in ibmvfc_init_host()
593 list_for_each_entry(tgt, &vhost->targets, queue) in ibmvfc_init_host()
595 scsi_block_requests(vhost->host); in ibmvfc_init_host()
596 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT); in ibmvfc_init_host()
597 vhost->job_step = ibmvfc_npiv_login; in ibmvfc_init_host()
598 wake_up(&vhost->work_wait_q); in ibmvfc_init_host()
611 static int ibmvfc_send_crq(struct ibmvfc_host *vhost, u64 word1, u64 word2) in ibmvfc_send_crq() argument
613 struct vio_dev *vdev = to_vio_dev(vhost->dev); in ibmvfc_send_crq()
624 static int ibmvfc_send_crq_init(struct ibmvfc_host *vhost) in ibmvfc_send_crq_init() argument
626 ibmvfc_dbg(vhost, "Sending CRQ init\n"); in ibmvfc_send_crq_init()
627 return ibmvfc_send_crq(vhost, 0xC001000000000000LL, 0); in ibmvfc_send_crq_init()
637 static int ibmvfc_send_crq_init_complete(struct ibmvfc_host *vhost) in ibmvfc_send_crq_init_complete() argument
639 ibmvfc_dbg(vhost, "Sending CRQ init complete\n"); in ibmvfc_send_crq_init_complete()
640 return ibmvfc_send_crq(vhost, 0xC002000000000000LL, 0); in ibmvfc_send_crq_init_complete()
650 static void ibmvfc_release_crq_queue(struct ibmvfc_host *vhost) in ibmvfc_release_crq_queue() argument
653 struct vio_dev *vdev = to_vio_dev(vhost->dev); in ibmvfc_release_crq_queue()
654 struct ibmvfc_crq_queue *crq = &vhost->crq; in ibmvfc_release_crq_queue()
656 ibmvfc_dbg(vhost, "Releasing CRQ\n"); in ibmvfc_release_crq_queue()
657 free_irq(vdev->irq, vhost); in ibmvfc_release_crq_queue()
658 tasklet_kill(&vhost->tasklet); in ibmvfc_release_crq_queue()
665 vhost->state = IBMVFC_NO_CRQ; in ibmvfc_release_crq_queue()
666 vhost->logged_in = 0; in ibmvfc_release_crq_queue()
667 dma_unmap_single(vhost->dev, crq->msg_token, PAGE_SIZE, DMA_BIDIRECTIONAL); in ibmvfc_release_crq_queue()
678 static int ibmvfc_reenable_crq_queue(struct ibmvfc_host *vhost) in ibmvfc_reenable_crq_queue() argument
681 struct vio_dev *vdev = to_vio_dev(vhost->dev); in ibmvfc_reenable_crq_queue()
691 dev_err(vhost->dev, "Error enabling adapter (rc=%d)\n", rc); in ibmvfc_reenable_crq_queue()
703 static int ibmvfc_reset_crq(struct ibmvfc_host *vhost) in ibmvfc_reset_crq() argument
707 struct vio_dev *vdev = to_vio_dev(vhost->dev); in ibmvfc_reset_crq()
708 struct ibmvfc_crq_queue *crq = &vhost->crq; in ibmvfc_reset_crq()
717 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_reset_crq()
718 vhost->state = IBMVFC_NO_CRQ; in ibmvfc_reset_crq()
719 vhost->logged_in = 0; in ibmvfc_reset_crq()
720 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE); in ibmvfc_reset_crq()
732 dev_warn(vhost->dev, "Partner adapter not ready\n"); in ibmvfc_reset_crq()
734 dev_warn(vhost->dev, "Couldn't register crq (rc=%d)\n", rc); in ibmvfc_reset_crq()
735 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_reset_crq()
766 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_free_event() local
767 struct ibmvfc_event_pool *pool = &vhost->pool; in ibmvfc_free_event()
771 list_add_tail(&evt->queue, &vhost->free); in ibmvfc_free_event()
826 static void ibmvfc_purge_requests(struct ibmvfc_host *vhost, int error_code) in ibmvfc_purge_requests() argument
830 ibmvfc_dbg(vhost, "Purging all requests\n"); in ibmvfc_purge_requests()
831 list_for_each_entry_safe(evt, pos, &vhost->sent, queue) in ibmvfc_purge_requests()
839 static void ibmvfc_hard_reset_host(struct ibmvfc_host *vhost) in ibmvfc_hard_reset_host() argument
841 ibmvfc_purge_requests(vhost, DID_ERROR); in ibmvfc_hard_reset_host()
842 ibmvfc_link_down(vhost, IBMVFC_LINK_DOWN); in ibmvfc_hard_reset_host()
843 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_RESET); in ibmvfc_hard_reset_host()
850 static void __ibmvfc_reset_host(struct ibmvfc_host *vhost) in __ibmvfc_reset_host() argument
852 if (vhost->logged_in && vhost->action != IBMVFC_HOST_ACTION_LOGO_WAIT && in __ibmvfc_reset_host()
853 !ibmvfc_set_host_state(vhost, IBMVFC_INITIALIZING)) { in __ibmvfc_reset_host()
854 scsi_block_requests(vhost->host); in __ibmvfc_reset_host()
855 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_LOGO); in __ibmvfc_reset_host()
856 vhost->job_step = ibmvfc_npiv_logout; in __ibmvfc_reset_host()
857 wake_up(&vhost->work_wait_q); in __ibmvfc_reset_host()
859 ibmvfc_hard_reset_host(vhost); in __ibmvfc_reset_host()
866 static void ibmvfc_reset_host(struct ibmvfc_host *vhost) in ibmvfc_reset_host() argument
870 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_reset_host()
871 __ibmvfc_reset_host(vhost); in ibmvfc_reset_host()
872 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_reset_host()
882 static int ibmvfc_retry_host_init(struct ibmvfc_host *vhost) in ibmvfc_retry_host_init() argument
886 if (vhost->action == IBMVFC_HOST_ACTION_INIT_WAIT) { in ibmvfc_retry_host_init()
887 vhost->delay_init = 1; in ibmvfc_retry_host_init()
888 if (++vhost->init_retries > IBMVFC_MAX_HOST_INIT_RETRIES) { in ibmvfc_retry_host_init()
889 dev_err(vhost->dev, in ibmvfc_retry_host_init()
891 ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE); in ibmvfc_retry_host_init()
892 } else if (vhost->init_retries == IBMVFC_MAX_HOST_INIT_RETRIES) in ibmvfc_retry_host_init()
893 __ibmvfc_reset_host(vhost); in ibmvfc_retry_host_init()
895 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT); in ibmvfc_retry_host_init()
900 wake_up(&vhost->work_wait_q); in ibmvfc_retry_host_init()
914 struct ibmvfc_host *vhost = shost_priv(shost); in __ibmvfc_get_target() local
917 list_for_each_entry(tgt, &vhost->targets, queue) in __ibmvfc_get_target()
953 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_get_host_speed() local
957 if (vhost->state == IBMVFC_ACTIVE) { in ibmvfc_get_host_speed()
958 switch (be64_to_cpu(vhost->login_buf->resp.link_speed) / 100) { in ibmvfc_get_host_speed()
978 ibmvfc_log(vhost, 3, "Unknown port speed: %lld Gbit\n", in ibmvfc_get_host_speed()
979 be64_to_cpu(vhost->login_buf->resp.link_speed) / 100); in ibmvfc_get_host_speed()
997 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_get_host_port_state() local
1001 switch (vhost->state) { in ibmvfc_get_host_port_state()
1020 ibmvfc_log(vhost, 3, "Unknown port state: %d\n", vhost->state); in ibmvfc_get_host_port_state()
1106 static int ibmvfc_wait_while_resetting(struct ibmvfc_host *vhost) in ibmvfc_wait_while_resetting() argument
1108 long timeout = wait_event_timeout(vhost->init_wait_q, in ibmvfc_wait_while_resetting()
1109 ((vhost->state == IBMVFC_ACTIVE || in ibmvfc_wait_while_resetting()
1110 vhost->state == IBMVFC_HOST_OFFLINE || in ibmvfc_wait_while_resetting()
1111 vhost->state == IBMVFC_LINK_DEAD) && in ibmvfc_wait_while_resetting()
1112 vhost->action == IBMVFC_HOST_ACTION_NONE), in ibmvfc_wait_while_resetting()
1127 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_issue_fc_host_lip() local
1129 dev_err(vhost->dev, "Initiating host LIP. Resetting connection\n"); in ibmvfc_issue_fc_host_lip()
1130 ibmvfc_reset_host(vhost); in ibmvfc_issue_fc_host_lip()
1131 return ibmvfc_wait_while_resetting(vhost); in ibmvfc_issue_fc_host_lip()
1140 static void ibmvfc_gather_partition_info(struct ibmvfc_host *vhost) in ibmvfc_gather_partition_info() argument
1152 strncpy(vhost->partition_name, name, sizeof(vhost->partition_name)); in ibmvfc_gather_partition_info()
1155 vhost->partition_number = *num; in ibmvfc_gather_partition_info()
1166 static void ibmvfc_set_login_info(struct ibmvfc_host *vhost) in ibmvfc_set_login_info() argument
1168 struct ibmvfc_npiv_login *login_info = &vhost->login_info; in ibmvfc_set_login_info()
1169 struct device_node *of_node = vhost->dev->of_node; in ibmvfc_set_login_info()
1178 login_info->partition_num = cpu_to_be32(vhost->partition_number); in ibmvfc_set_login_info()
1182 if (vhost->client_migrated) in ibmvfc_set_login_info()
1187 login_info->async.va = cpu_to_be64(vhost->async_crq.msg_token); in ibmvfc_set_login_info()
1188 login_info->async.len = cpu_to_be32(vhost->async_crq.size * sizeof(*vhost->async_crq.msgs)); in ibmvfc_set_login_info()
1189 strncpy(login_info->partition_name, vhost->partition_name, IBMVFC_MAX_NAME); in ibmvfc_set_login_info()
1191 dev_name(&vhost->host->shost_gendev), IBMVFC_MAX_NAME); in ibmvfc_set_login_info()
1194 location = location ? location : dev_name(vhost->dev); in ibmvfc_set_login_info()
1204 static int ibmvfc_init_event_pool(struct ibmvfc_host *vhost) in ibmvfc_init_event_pool() argument
1207 struct ibmvfc_event_pool *pool = &vhost->pool; in ibmvfc_init_event_pool()
1215 pool->iu_storage = dma_alloc_coherent(vhost->dev, in ibmvfc_init_event_pool()
1230 evt->vhost = vhost; in ibmvfc_init_event_pool()
1232 list_add_tail(&evt->queue, &vhost->free); in ibmvfc_init_event_pool()
1244 static void ibmvfc_free_event_pool(struct ibmvfc_host *vhost) in ibmvfc_free_event_pool() argument
1247 struct ibmvfc_event_pool *pool = &vhost->pool; in ibmvfc_free_event_pool()
1254 dma_pool_free(vhost->sg_pool, in ibmvfc_free_event_pool()
1260 dma_free_coherent(vhost->dev, in ibmvfc_free_event_pool()
1272 static struct ibmvfc_event *ibmvfc_get_event(struct ibmvfc_host *vhost) in ibmvfc_get_event() argument
1276 BUG_ON(list_empty(&vhost->free)); in ibmvfc_get_event()
1277 evt = list_entry(vhost->free.next, struct ibmvfc_event, queue); in ibmvfc_get_event()
1336 struct ibmvfc_host *vhost = dev_get_drvdata(dev); in ibmvfc_map_sg_data() local
1343 if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL) in ibmvfc_map_sg_data()
1364 evt->ext_list = dma_pool_alloc(vhost->sg_pool, GFP_ATOMIC, in ibmvfc_map_sg_data()
1369 if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL) in ibmvfc_map_sg_data()
1391 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_timeout() local
1392 dev_err(vhost->dev, "Command timed out (%p). Resetting connection\n", evt); in ibmvfc_timeout()
1393 ibmvfc_reset_host(vhost); in ibmvfc_timeout()
1405 struct ibmvfc_host *vhost, unsigned long timeout) in ibmvfc_send_event() argument
1419 list_add_tail(&evt->queue, &vhost->sent); in ibmvfc_send_event()
1431 if ((rc = ibmvfc_send_crq(vhost, be64_to_cpu(crq_as_u64[0]), in ibmvfc_send_event()
1443 dev_warn(vhost->dev, "Send warning. Receive queue closed, will retry.\n"); in ibmvfc_send_event()
1450 dev_err(vhost->dev, "Send error (rc=%d)\n", rc); in ibmvfc_send_event()
1472 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_log_error() local
1485 if (!logerr && (vhost->log_level <= (IBMVFC_DEFAULT_LOG_LEVEL + 1))) in ibmvfc_log_error()
1504 struct ibmvfc_host *vhost = shost_priv(sdev->host); in ibmvfc_relogin() local
1508 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_relogin()
1515 ibmvfc_reinit_host(vhost); in ibmvfc_relogin()
1580 static inline int ibmvfc_host_chkready(struct ibmvfc_host *vhost) in ibmvfc_host_chkready() argument
1584 switch (vhost->state) { in ibmvfc_host_chkready()
1614 struct ibmvfc_host *vhost = shost_priv(cmnd->device->host); in ibmvfc_queuecommand_lck() local
1621 unlikely((rc = ibmvfc_host_chkready(vhost)))) { in ibmvfc_queuecommand_lck()
1628 evt = ibmvfc_get_event(vhost); in ibmvfc_queuecommand_lck()
1650 if (likely(!(rc = ibmvfc_map_sg_data(cmnd, evt, vfc_cmd, vhost->dev)))) in ibmvfc_queuecommand_lck()
1651 return ibmvfc_send_event(evt, vhost, 0); in ibmvfc_queuecommand_lck()
1657 if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL) in ibmvfc_queuecommand_lck()
1689 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_bsg_timeout_done() local
1692 vhost->aborting_passthru = 0; in ibmvfc_bsg_timeout_done()
1693 dev_info(vhost->dev, "Passthru command cancelled\n"); in ibmvfc_bsg_timeout_done()
1705 struct ibmvfc_host *vhost = shost_priv(job->shost); in ibmvfc_bsg_timeout() local
1713 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_bsg_timeout()
1714 if (vhost->aborting_passthru || vhost->state != IBMVFC_ACTIVE) { in ibmvfc_bsg_timeout()
1715 __ibmvfc_reset_host(vhost); in ibmvfc_bsg_timeout()
1716 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_bsg_timeout()
1720 vhost->aborting_passthru = 1; in ibmvfc_bsg_timeout()
1721 evt = ibmvfc_get_event(vhost); in ibmvfc_bsg_timeout()
1732 rc = ibmvfc_send_event(evt, vhost, default_timeout); in ibmvfc_bsg_timeout()
1735 vhost->aborting_passthru = 0; in ibmvfc_bsg_timeout()
1736 dev_err(vhost->dev, "Failed to send cancel event. rc=%d\n", rc); in ibmvfc_bsg_timeout()
1739 dev_info(vhost->dev, "Cancelling passthru command to port id 0x%lx\n", in ibmvfc_bsg_timeout()
1742 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_bsg_timeout()
1756 static int ibmvfc_bsg_plogi(struct ibmvfc_host *vhost, unsigned int port_id) in ibmvfc_bsg_plogi() argument
1766 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_bsg_plogi()
1767 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_bsg_plogi()
1776 if (unlikely((rc = ibmvfc_host_chkready(vhost)))) in ibmvfc_bsg_plogi()
1779 evt = ibmvfc_get_event(vhost); in ibmvfc_bsg_plogi()
1790 rc = ibmvfc_send_event(evt, vhost, default_timeout); in ibmvfc_bsg_plogi()
1791 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_bsg_plogi()
1801 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_bsg_plogi()
1804 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_bsg_plogi()
1818 struct ibmvfc_host *vhost = shost_priv(job->shost); in ibmvfc_bsg_request() local
1855 if (!mutex_trylock(&vhost->passthru_mutex)) in ibmvfc_bsg_request()
1859 req_seg = dma_map_sg(vhost->dev, job->request_payload.sg_list, in ibmvfc_bsg_request()
1863 mutex_unlock(&vhost->passthru_mutex); in ibmvfc_bsg_request()
1867 rsp_seg = dma_map_sg(vhost->dev, job->reply_payload.sg_list, in ibmvfc_bsg_request()
1871 dma_unmap_sg(vhost->dev, job->request_payload.sg_list, in ibmvfc_bsg_request()
1873 mutex_unlock(&vhost->passthru_mutex); in ibmvfc_bsg_request()
1883 rc = ibmvfc_bsg_plogi(vhost, port_id); in ibmvfc_bsg_request()
1885 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_bsg_request()
1888 unlikely((rc = ibmvfc_host_chkready(vhost)))) { in ibmvfc_bsg_request()
1889 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_bsg_request()
1893 evt = ibmvfc_get_event(vhost); in ibmvfc_bsg_request()
1921 rc = ibmvfc_send_event(evt, vhost, 0); in ibmvfc_bsg_request()
1922 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_bsg_request()
1936 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_bsg_request()
1938 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_bsg_request()
1943 dma_unmap_sg(vhost->dev, job->request_payload.sg_list, in ibmvfc_bsg_request()
1945 dma_unmap_sg(vhost->dev, job->reply_payload.sg_list, in ibmvfc_bsg_request()
1947 mutex_unlock(&vhost->passthru_mutex); in ibmvfc_bsg_request()
1963 struct ibmvfc_host *vhost = shost_priv(sdev->host); in ibmvfc_reset_device() local
1973 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_reset_device()
1974 if (vhost->state == IBMVFC_ACTIVE) { in ibmvfc_reset_device()
1975 evt = ibmvfc_get_event(vhost); in ibmvfc_reset_device()
1993 rsp_rc = ibmvfc_send_event(evt, vhost, default_timeout); in ibmvfc_reset_device()
1995 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_reset_device()
2022 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_reset_device()
2024 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_reset_device()
2087 static int ibmvfc_wait_for_ops(struct ibmvfc_host *vhost, void *device, in ibmvfc_wait_for_ops() argument
2099 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_wait_for_ops()
2100 list_for_each_entry(evt, &vhost->sent, queue) { in ibmvfc_wait_for_ops()
2106 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_wait_for_ops()
2113 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_wait_for_ops()
2114 list_for_each_entry(evt, &vhost->sent, queue) { in ibmvfc_wait_for_ops()
2120 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_wait_for_ops()
2122 dev_err(vhost->dev, "Timed out waiting for aborted commands\n"); in ibmvfc_wait_for_ops()
2146 struct ibmvfc_host *vhost = shost_priv(sdev->host); in ibmvfc_cancel_all() local
2157 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_cancel_all()
2159 list_for_each_entry(evt, &vhost->sent, queue) { in ibmvfc_cancel_all()
2167 if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL) in ibmvfc_cancel_all()
2169 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_cancel_all()
2173 if (vhost->logged_in) { in ibmvfc_cancel_all()
2174 evt = ibmvfc_get_event(vhost); in ibmvfc_cancel_all()
2184 if (!(be64_to_cpu(vhost->login_buf->resp.capabilities) & IBMVFC_CAN_SUPPRESS_ABTS)) in ibmvfc_cancel_all()
2186 if (vhost->state == IBMVFC_ACTIVE) in ibmvfc_cancel_all()
2195 rsp_rc = ibmvfc_send_event(evt, vhost, default_timeout); in ibmvfc_cancel_all()
2198 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_cancel_all()
2212 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_cancel_all()
2214 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_cancel_all()
2278 struct ibmvfc_host *vhost = shost_priv(sdev->host); in ibmvfc_abort_task_set() local
2288 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_abort_task_set()
2290 list_for_each_entry(evt, &vhost->sent, queue) { in ibmvfc_abort_task_set()
2298 if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL) in ibmvfc_abort_task_set()
2300 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_abort_task_set()
2304 if (vhost->state == IBMVFC_ACTIVE) { in ibmvfc_abort_task_set()
2305 evt = ibmvfc_get_event(vhost); in ibmvfc_abort_task_set()
2323 rsp_rc = ibmvfc_send_event(evt, vhost, default_timeout); in ibmvfc_abort_task_set()
2326 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_abort_task_set()
2339 rc = ibmvfc_wait_for_ops(vhost, sdev->hostdata, ibmvfc_match_key); in ibmvfc_abort_task_set()
2346 ibmvfc_reset_host(vhost); in ibmvfc_abort_task_set()
2348 rc = ibmvfc_wait_for_ops(vhost, sdev->hostdata, ibmvfc_match_key); in ibmvfc_abort_task_set()
2353 rc = ibmvfc_wait_for_ops(vhost, evt, ibmvfc_match_evt); in ibmvfc_abort_task_set()
2355 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_abort_task_set()
2356 ibmvfc_hard_reset_host(vhost); in ibmvfc_abort_task_set()
2357 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_abort_task_set()
2382 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_abort_task_set()
2384 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_abort_task_set()
2398 struct ibmvfc_host *vhost = shost_priv(sdev->host); in ibmvfc_eh_abort_handler() local
2404 ibmvfc_wait_while_resetting(vhost); in ibmvfc_eh_abort_handler()
2412 rc = ibmvfc_wait_for_ops(vhost, sdev, ibmvfc_match_lun); in ibmvfc_eh_abort_handler()
2431 struct ibmvfc_host *vhost = shost_priv(sdev->host); in ibmvfc_eh_device_reset_handler() local
2437 ibmvfc_wait_while_resetting(vhost); in ibmvfc_eh_device_reset_handler()
2445 rc = ibmvfc_wait_for_ops(vhost, sdev, ibmvfc_match_lun); in ibmvfc_eh_device_reset_handler()
2488 struct ibmvfc_host *vhost = shost_priv(sdev->host); in ibmvfc_eh_target_reset_handler() local
2497 ibmvfc_wait_while_resetting(vhost); in ibmvfc_eh_target_reset_handler()
2505 rc = ibmvfc_wait_for_ops(vhost, starget, ibmvfc_match_target); in ibmvfc_eh_target_reset_handler()
2522 struct ibmvfc_host *vhost = shost_priv(cmd->device->host); in ibmvfc_eh_host_reset_handler() local
2525 dev_err(vhost->dev, "Resetting connection due to error recovery\n"); in ibmvfc_eh_host_reset_handler()
2526 rc = ibmvfc_issue_fc_host_lip(vhost->host); in ibmvfc_eh_host_reset_handler()
2544 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_terminate_rport_io() local
2557 rc = ibmvfc_wait_for_ops(vhost, rport, ibmvfc_match_rport); in ibmvfc_terminate_rport_io()
2633 struct ibmvfc_host *vhost) in ibmvfc_handle_async() argument
2638 ibmvfc_log(vhost, desc->log_level, "%s event received. scsi_id: %llx, wwpn: %llx," in ibmvfc_handle_async()
2646 ibmvfc_link_down(vhost, IBMVFC_LINK_DOWN); in ibmvfc_handle_async()
2649 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_handle_async()
2654 vhost->events_to_log |= IBMVFC_AE_LINKUP; in ibmvfc_handle_async()
2655 vhost->delay_init = 1; in ibmvfc_handle_async()
2656 __ibmvfc_reset_host(vhost); in ibmvfc_handle_async()
2662 vhost->events_to_log |= IBMVFC_AE_LINKUP; in ibmvfc_handle_async()
2663 vhost->delay_init = 1; in ibmvfc_handle_async()
2664 __ibmvfc_reset_host(vhost); in ibmvfc_handle_async()
2668 vhost->events_to_log |= IBMVFC_AE_RSCN; in ibmvfc_handle_async()
2669 if (vhost->state < IBMVFC_HALTED) { in ibmvfc_handle_async()
2670 vhost->delay_init = 1; in ibmvfc_handle_async()
2671 __ibmvfc_reset_host(vhost); in ibmvfc_handle_async()
2676 vhost->events_to_log |= IBMVFC_AE_RSCN; in ibmvfc_handle_async()
2677 ibmvfc_reinit_host(vhost); in ibmvfc_handle_async()
2682 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_handle_async()
2695 ibmvfc_reinit_host(vhost); in ibmvfc_handle_async()
2701 ibmvfc_link_down(vhost, IBMVFC_LINK_DOWN); in ibmvfc_handle_async()
2704 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_handle_async()
2707 ibmvfc_link_down(vhost, IBMVFC_HALTED); in ibmvfc_handle_async()
2710 dev_err(vhost->dev, "Unknown async event received: %lld\n", crq->event); in ibmvfc_handle_async()
2721 static void ibmvfc_handle_crq(struct ibmvfc_crq *crq, struct ibmvfc_host *vhost) in ibmvfc_handle_crq() argument
2730 dev_info(vhost->dev, "Partner initialized\n"); in ibmvfc_handle_crq()
2732 rc = ibmvfc_send_crq_init_complete(vhost); in ibmvfc_handle_crq()
2734 ibmvfc_init_host(vhost); in ibmvfc_handle_crq()
2736 dev_err(vhost->dev, "Unable to send init rsp. rc=%ld\n", rc); in ibmvfc_handle_crq()
2739 dev_info(vhost->dev, "Partner initialization complete\n"); in ibmvfc_handle_crq()
2740 ibmvfc_init_host(vhost); in ibmvfc_handle_crq()
2743 dev_err(vhost->dev, "Unknown crq message type: %d\n", crq->format); in ibmvfc_handle_crq()
2747 vhost->state = IBMVFC_NO_CRQ; in ibmvfc_handle_crq()
2748 vhost->logged_in = 0; in ibmvfc_handle_crq()
2749 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE); in ibmvfc_handle_crq()
2752 dev_info(vhost->dev, "Re-enabling adapter\n"); in ibmvfc_handle_crq()
2753 vhost->client_migrated = 1; in ibmvfc_handle_crq()
2754 ibmvfc_purge_requests(vhost, DID_REQUEUE); in ibmvfc_handle_crq()
2755 ibmvfc_link_down(vhost, IBMVFC_LINK_DOWN); in ibmvfc_handle_crq()
2756 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_REENABLE); in ibmvfc_handle_crq()
2758 dev_err(vhost->dev, "Virtual adapter failed (rc=%d)\n", crq->format); in ibmvfc_handle_crq()
2759 ibmvfc_purge_requests(vhost, DID_ERROR); in ibmvfc_handle_crq()
2760 ibmvfc_link_down(vhost, IBMVFC_LINK_DOWN); in ibmvfc_handle_crq()
2761 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_RESET); in ibmvfc_handle_crq()
2767 dev_err(vhost->dev, "Got an invalid message type 0x%02x\n", crq->valid); in ibmvfc_handle_crq()
2778 if (unlikely(!ibmvfc_valid_event(&vhost->pool, evt))) { in ibmvfc_handle_crq()
2779 dev_err(vhost->dev, "Returned correlation_token 0x%08llx is invalid!\n", in ibmvfc_handle_crq()
2785 dev_err(vhost->dev, "Received duplicate correlation_token 0x%08llx!\n", in ibmvfc_handle_crq()
2807 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_scan_finished() local
2812 dev_info(vhost->dev, "Scan taking longer than %d seconds, " in ibmvfc_scan_finished()
2817 if (vhost->scan_complete) in ibmvfc_scan_finished()
2837 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_slave_alloc() local
2844 sdev->hostdata = (void *)(unsigned long)vhost->task_set++; in ibmvfc_slave_alloc()
2862 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_target_alloc() local
2866 starget->hostdata = (void *)(unsigned long)vhost->task_set++; in ibmvfc_target_alloc()
2914 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_show_host_partition_name() local
2917 vhost->login_buf->resp.partition_name); in ibmvfc_show_host_partition_name()
2924 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_show_host_device_name() local
2927 vhost->login_buf->resp.device_name); in ibmvfc_show_host_device_name()
2934 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_show_host_loc_code() local
2937 vhost->login_buf->resp.port_loc_code); in ibmvfc_show_host_loc_code()
2944 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_show_host_drc_name() local
2947 vhost->login_buf->resp.drc_name); in ibmvfc_show_host_drc_name()
2954 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_show_host_npiv_version() local
2955 return snprintf(buf, PAGE_SIZE, "%d\n", vhost->login_buf->resp.version); in ibmvfc_show_host_npiv_version()
2962 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_show_host_capabilities() local
2963 return snprintf(buf, PAGE_SIZE, "%llx\n", vhost->login_buf->resp.capabilities); in ibmvfc_show_host_capabilities()
2978 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_show_log_level() local
2983 len = snprintf(buf, PAGE_SIZE, "%d\n", vhost->log_level); in ibmvfc_show_log_level()
3001 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_store_log_level() local
3005 vhost->log_level = simple_strtoul(buf, NULL, 10); in ibmvfc_store_log_level()
3038 struct ibmvfc_host *vhost = shost_priv(shost); in ibmvfc_read_trace() local
3041 char *src = (char *)vhost->trace; in ibmvfc_read_trace()
3108 static struct ibmvfc_async_crq *ibmvfc_next_async_crq(struct ibmvfc_host *vhost) in ibmvfc_next_async_crq() argument
3110 struct ibmvfc_async_crq_queue *async_crq = &vhost->async_crq; in ibmvfc_next_async_crq()
3131 static struct ibmvfc_crq *ibmvfc_next_crq(struct ibmvfc_host *vhost) in ibmvfc_next_crq() argument
3133 struct ibmvfc_crq_queue *queue = &vhost->crq; in ibmvfc_next_crq()
3157 struct ibmvfc_host *vhost = (struct ibmvfc_host *)dev_instance; in ibmvfc_interrupt() local
3160 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_interrupt()
3161 vio_disable_interrupts(to_vio_dev(vhost->dev)); in ibmvfc_interrupt()
3162 tasklet_schedule(&vhost->tasklet); in ibmvfc_interrupt()
3163 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_interrupt()
3176 struct ibmvfc_host *vhost = data; in ibmvfc_tasklet() local
3177 struct vio_dev *vdev = to_vio_dev(vhost->dev); in ibmvfc_tasklet()
3183 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_tasklet()
3186 while ((async = ibmvfc_next_async_crq(vhost)) != NULL) { in ibmvfc_tasklet()
3187 ibmvfc_handle_async(async, vhost); in ibmvfc_tasklet()
3193 while ((crq = ibmvfc_next_crq(vhost)) != NULL) { in ibmvfc_tasklet()
3194 ibmvfc_handle_crq(crq, vhost); in ibmvfc_tasklet()
3200 if ((async = ibmvfc_next_async_crq(vhost)) != NULL) { in ibmvfc_tasklet()
3202 ibmvfc_handle_async(async, vhost); in ibmvfc_tasklet()
3205 } else if ((crq = ibmvfc_next_crq(vhost)) != NULL) { in ibmvfc_tasklet()
3207 ibmvfc_handle_crq(crq, vhost); in ibmvfc_tasklet()
3214 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_tasklet()
3228 wake_up(&tgt->vhost->work_wait_q); in ibmvfc_init_tgt()
3244 wake_up(&tgt->vhost->work_wait_q); in ibmvfc_retry_tgt_init()
3293 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_prli_done() local
3299 vhost->discovery_threads--; in ibmvfc_tgt_prli_done()
3351 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_prli_done()
3362 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_send_prli() local
3365 if (vhost->discovery_threads >= disc_threads) in ibmvfc_tgt_send_prli()
3369 evt = ibmvfc_get_event(vhost); in ibmvfc_tgt_send_prli()
3370 vhost->discovery_threads++; in ibmvfc_tgt_send_prli()
3385 if (ibmvfc_send_event(evt, vhost, default_timeout)) { in ibmvfc_tgt_send_prli()
3386 vhost->discovery_threads--; in ibmvfc_tgt_send_prli()
3401 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_plogi_done() local
3406 vhost->discovery_threads--; in ibmvfc_tgt_plogi_done()
3413 vhost->reinit = 1; in ibmvfc_tgt_plogi_done()
3447 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_plogi_done()
3458 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_send_plogi() local
3461 if (vhost->discovery_threads >= disc_threads) in ibmvfc_tgt_send_plogi()
3466 evt = ibmvfc_get_event(vhost); in ibmvfc_tgt_send_plogi()
3467 vhost->discovery_threads++; in ibmvfc_tgt_send_plogi()
3478 if (ibmvfc_send_event(evt, vhost, default_timeout)) { in ibmvfc_tgt_send_plogi()
3479 vhost->discovery_threads--; in ibmvfc_tgt_send_plogi()
3494 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_implicit_logout_done() local
3498 vhost->discovery_threads--; in ibmvfc_tgt_implicit_logout_done()
3508 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_implicit_logout_done()
3516 if (vhost->action == IBMVFC_HOST_ACTION_TGT_INIT) in ibmvfc_tgt_implicit_logout_done()
3518 else if (vhost->action == IBMVFC_HOST_ACTION_QUERY_TGTS && in ibmvfc_tgt_implicit_logout_done()
3522 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_implicit_logout_done()
3533 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_implicit_logout() local
3536 if (vhost->discovery_threads >= disc_threads) in ibmvfc_tgt_implicit_logout()
3540 evt = ibmvfc_get_event(vhost); in ibmvfc_tgt_implicit_logout()
3541 vhost->discovery_threads++; in ibmvfc_tgt_implicit_logout()
3552 if (ibmvfc_send_event(evt, vhost, default_timeout)) { in ibmvfc_tgt_implicit_logout()
3553 vhost->discovery_threads--; in ibmvfc_tgt_implicit_logout()
3590 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_adisc_done() local
3595 vhost->discovery_threads--; in ibmvfc_tgt_adisc_done()
3622 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_adisc_done()
3665 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_adisc_cancel_done() local
3669 vhost->abort_threads--; in ibmvfc_tgt_adisc_cancel_done()
3672 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_adisc_cancel_done()
3685 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_adisc_timeout() local
3692 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_adisc_timeout()
3693 if (vhost->abort_threads >= disc_threads || in ibmvfc_adisc_timeout()
3695 vhost->state != IBMVFC_INITIALIZING || in ibmvfc_adisc_timeout()
3696 vhost->action != IBMVFC_HOST_ACTION_QUERY_TGTS) { in ibmvfc_adisc_timeout()
3697 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_adisc_timeout()
3701 vhost->abort_threads++; in ibmvfc_adisc_timeout()
3703 evt = ibmvfc_get_event(vhost); in ibmvfc_adisc_timeout()
3715 rc = ibmvfc_send_event(evt, vhost, default_timeout); in ibmvfc_adisc_timeout()
3719 vhost->abort_threads--; in ibmvfc_adisc_timeout()
3721 __ibmvfc_reset_host(vhost); in ibmvfc_adisc_timeout()
3724 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_adisc_timeout()
3741 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_adisc() local
3744 if (vhost->discovery_threads >= disc_threads) in ibmvfc_tgt_adisc()
3748 evt = ibmvfc_get_event(vhost); in ibmvfc_tgt_adisc()
3749 vhost->discovery_threads++; in ibmvfc_tgt_adisc()
3760 memcpy(&mad->fc_iu.payload[2], &vhost->login_buf->resp.port_name, in ibmvfc_tgt_adisc()
3761 sizeof(vhost->login_buf->resp.port_name)); in ibmvfc_tgt_adisc()
3762 memcpy(&mad->fc_iu.payload[4], &vhost->login_buf->resp.node_name, in ibmvfc_tgt_adisc()
3763 sizeof(vhost->login_buf->resp.node_name)); in ibmvfc_tgt_adisc()
3764 mad->fc_iu.payload[6] = cpu_to_be32(be64_to_cpu(vhost->login_buf->resp.scsi_id) & 0x00ffffff); in ibmvfc_tgt_adisc()
3776 if (ibmvfc_send_event(evt, vhost, IBMVFC_ADISC_PLUS_CANCEL_TIMEOUT)) { in ibmvfc_tgt_adisc()
3777 vhost->discovery_threads--; in ibmvfc_tgt_adisc()
3793 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_query_target_done() local
3798 vhost->discovery_threads--; in ibmvfc_tgt_query_target_done()
3835 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_query_target_done()
3846 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_query_target() local
3849 if (vhost->discovery_threads >= disc_threads) in ibmvfc_tgt_query_target()
3853 evt = ibmvfc_get_event(vhost); in ibmvfc_tgt_query_target()
3854 vhost->discovery_threads++; in ibmvfc_tgt_query_target()
3865 if (ibmvfc_send_event(evt, vhost, default_timeout)) { in ibmvfc_tgt_query_target()
3866 vhost->discovery_threads--; in ibmvfc_tgt_query_target()
3881 static int ibmvfc_alloc_target(struct ibmvfc_host *vhost, u64 scsi_id) in ibmvfc_alloc_target() argument
3886 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_alloc_target()
3887 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_alloc_target()
3894 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_alloc_target()
3896 tgt = mempool_alloc(vhost->tgt_pool, GFP_NOIO); in ibmvfc_alloc_target()
3898 dev_err(vhost->dev, "Target allocation failure for scsi id %08llx\n", in ibmvfc_alloc_target()
3906 tgt->vhost = vhost; in ibmvfc_alloc_target()
3908 tgt->cancel_key = vhost->task_set++; in ibmvfc_alloc_target()
3912 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_alloc_target()
3913 list_add_tail(&tgt->queue, &vhost->targets); in ibmvfc_alloc_target()
3916 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_alloc_target()
3927 static int ibmvfc_alloc_targets(struct ibmvfc_host *vhost) in ibmvfc_alloc_targets() argument
3931 for (i = 0, rc = 0; !rc && i < vhost->num_targets; i++) in ibmvfc_alloc_targets()
3932 rc = ibmvfc_alloc_target(vhost, in ibmvfc_alloc_targets()
3933 be32_to_cpu(vhost->disc_buf->scsi_id[i]) & in ibmvfc_alloc_targets()
3946 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_discover_targets_done() local
3953 ibmvfc_dbg(vhost, "Discover Targets succeeded\n"); in ibmvfc_discover_targets_done()
3954 vhost->num_targets = be32_to_cpu(rsp->num_written); in ibmvfc_discover_targets_done()
3955 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_ALLOC_TGTS); in ibmvfc_discover_targets_done()
3958 level += ibmvfc_retry_host_init(vhost); in ibmvfc_discover_targets_done()
3959 ibmvfc_log(vhost, level, "Discover Targets failed: %s (%x:%x)\n", in ibmvfc_discover_targets_done()
3966 dev_err(vhost->dev, "Invalid Discover Targets response: 0x%x\n", mad_status); in ibmvfc_discover_targets_done()
3967 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_discover_targets_done()
3972 wake_up(&vhost->work_wait_q); in ibmvfc_discover_targets_done()
3980 static void ibmvfc_discover_targets(struct ibmvfc_host *vhost) in ibmvfc_discover_targets() argument
3983 struct ibmvfc_event *evt = ibmvfc_get_event(vhost); in ibmvfc_discover_targets()
3991 mad->bufflen = cpu_to_be32(vhost->disc_buf_sz); in ibmvfc_discover_targets()
3992 mad->buffer.va = cpu_to_be64(vhost->disc_buf_dma); in ibmvfc_discover_targets()
3993 mad->buffer.len = cpu_to_be32(vhost->disc_buf_sz); in ibmvfc_discover_targets()
3994 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT_WAIT); in ibmvfc_discover_targets()
3996 if (!ibmvfc_send_event(evt, vhost, default_timeout)) in ibmvfc_discover_targets()
3997 ibmvfc_dbg(vhost, "Sent discover targets\n"); in ibmvfc_discover_targets()
3999 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_discover_targets()
4009 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_npiv_login_done() local
4011 struct ibmvfc_npiv_login_resp *rsp = &vhost->login_buf->resp; in ibmvfc_npiv_login_done()
4021 level += ibmvfc_retry_host_init(vhost); in ibmvfc_npiv_login_done()
4023 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_npiv_login_done()
4024 ibmvfc_log(vhost, level, "NPIV Login failed: %s (%x:%x)\n", in ibmvfc_npiv_login_done()
4030 ibmvfc_retry_host_init(vhost); in ibmvfc_npiv_login_done()
4035 dev_err(vhost->dev, "Invalid NPIV Login response: 0x%x\n", mad_status); in ibmvfc_npiv_login_done()
4036 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_npiv_login_done()
4041 vhost->client_migrated = 0; in ibmvfc_npiv_login_done()
4044 dev_err(vhost->dev, "Virtual adapter does not support FC. %x\n", in ibmvfc_npiv_login_done()
4046 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_npiv_login_done()
4047 wake_up(&vhost->work_wait_q); in ibmvfc_npiv_login_done()
4052 dev_err(vhost->dev, "Virtual adapter supported queue depth too small: %d\n", in ibmvfc_npiv_login_done()
4054 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_npiv_login_done()
4055 wake_up(&vhost->work_wait_q); in ibmvfc_npiv_login_done()
4059 vhost->logged_in = 1; in ibmvfc_npiv_login_done()
4061 dev_info(vhost->dev, "Host partition: %s, device: %s %s %s max sectors %u\n", in ibmvfc_npiv_login_done()
4065 fc_host_fabric_name(vhost->host) = be64_to_cpu(rsp->node_name); in ibmvfc_npiv_login_done()
4066 fc_host_node_name(vhost->host) = be64_to_cpu(rsp->node_name); in ibmvfc_npiv_login_done()
4067 fc_host_port_name(vhost->host) = be64_to_cpu(rsp->port_name); in ibmvfc_npiv_login_done()
4068 fc_host_port_id(vhost->host) = be64_to_cpu(rsp->scsi_id); in ibmvfc_npiv_login_done()
4069 fc_host_port_type(vhost->host) = FC_PORTTYPE_NPIV; in ibmvfc_npiv_login_done()
4070 fc_host_supported_classes(vhost->host) = 0; in ibmvfc_npiv_login_done()
4072 fc_host_supported_classes(vhost->host) |= FC_COS_CLASS1; in ibmvfc_npiv_login_done()
4074 fc_host_supported_classes(vhost->host) |= FC_COS_CLASS2; in ibmvfc_npiv_login_done()
4076 fc_host_supported_classes(vhost->host) |= FC_COS_CLASS3; in ibmvfc_npiv_login_done()
4077 fc_host_maxframe_size(vhost->host) = in ibmvfc_npiv_login_done()
4080 vhost->host->can_queue = be32_to_cpu(rsp->max_cmds) - IBMVFC_NUM_INTERNAL_REQ; in ibmvfc_npiv_login_done()
4081 vhost->host->max_sectors = npiv_max_sectors; in ibmvfc_npiv_login_done()
4082 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY); in ibmvfc_npiv_login_done()
4083 wake_up(&vhost->work_wait_q); in ibmvfc_npiv_login_done()
4091 static void ibmvfc_npiv_login(struct ibmvfc_host *vhost) in ibmvfc_npiv_login() argument
4094 struct ibmvfc_event *evt = ibmvfc_get_event(vhost); in ibmvfc_npiv_login()
4096 ibmvfc_gather_partition_info(vhost); in ibmvfc_npiv_login()
4097 ibmvfc_set_login_info(vhost); in ibmvfc_npiv_login()
4100 memcpy(vhost->login_buf, &vhost->login_info, sizeof(vhost->login_info)); in ibmvfc_npiv_login()
4106 mad->buffer.va = cpu_to_be64(vhost->login_buf_dma); in ibmvfc_npiv_login()
4107 mad->buffer.len = cpu_to_be32(sizeof(*vhost->login_buf)); in ibmvfc_npiv_login()
4109 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT_WAIT); in ibmvfc_npiv_login()
4111 if (!ibmvfc_send_event(evt, vhost, default_timeout)) in ibmvfc_npiv_login()
4112 ibmvfc_dbg(vhost, "Sent NPIV login\n"); in ibmvfc_npiv_login()
4114 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_npiv_login()
4124 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_npiv_logout_done() local
4131 if (list_empty(&vhost->sent) && in ibmvfc_npiv_logout_done()
4132 vhost->action == IBMVFC_HOST_ACTION_LOGO_WAIT) { in ibmvfc_npiv_logout_done()
4133 ibmvfc_init_host(vhost); in ibmvfc_npiv_logout_done()
4142 ibmvfc_dbg(vhost, "NPIV Logout failed. 0x%X\n", mad_status); in ibmvfc_npiv_logout_done()
4146 ibmvfc_hard_reset_host(vhost); in ibmvfc_npiv_logout_done()
4154 static void ibmvfc_npiv_logout(struct ibmvfc_host *vhost) in ibmvfc_npiv_logout() argument
4159 evt = ibmvfc_get_event(vhost); in ibmvfc_npiv_logout()
4168 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_LOGO_WAIT); in ibmvfc_npiv_logout()
4170 if (!ibmvfc_send_event(evt, vhost, default_timeout)) in ibmvfc_npiv_logout()
4171 ibmvfc_dbg(vhost, "Sent NPIV logout\n"); in ibmvfc_npiv_logout()
4173 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_npiv_logout()
4183 static int ibmvfc_dev_init_to_do(struct ibmvfc_host *vhost) in ibmvfc_dev_init_to_do() argument
4187 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_dev_init_to_do()
4203 static int __ibmvfc_work_to_do(struct ibmvfc_host *vhost) in __ibmvfc_work_to_do() argument
4209 switch (vhost->action) { in __ibmvfc_work_to_do()
4216 if (vhost->discovery_threads == disc_threads) in __ibmvfc_work_to_do()
4218 list_for_each_entry(tgt, &vhost->targets, queue) in __ibmvfc_work_to_do()
4221 list_for_each_entry(tgt, &vhost->targets, queue) in __ibmvfc_work_to_do()
4247 static int ibmvfc_work_to_do(struct ibmvfc_host *vhost) in ibmvfc_work_to_do() argument
4252 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_work_to_do()
4253 rc = __ibmvfc_work_to_do(vhost); in ibmvfc_work_to_do()
4254 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_work_to_do()
4264 static void ibmvfc_log_ae(struct ibmvfc_host *vhost, int events) in ibmvfc_log_ae() argument
4267 fc_host_post_event(vhost->host, fc_get_event_number(), FCH_EVT_RSCN, 0); in ibmvfc_log_ae()
4269 vhost->state >= IBMVFC_HALTED) in ibmvfc_log_ae()
4270 fc_host_post_event(vhost->host, fc_get_event_number(), FCH_EVT_LINKDOWN, 0); in ibmvfc_log_ae()
4272 vhost->state == IBMVFC_INITIALIZING) in ibmvfc_log_ae()
4273 fc_host_post_event(vhost->host, fc_get_event_number(), FCH_EVT_LINKUP, 0); in ibmvfc_log_ae()
4283 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_add_rport() local
4288 rport = fc_remote_port_add(vhost->host, 0, &tgt->ids); in ibmvfc_tgt_add_rport()
4289 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_tgt_add_rport()
4295 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_tgt_add_rport()
4301 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_tgt_add_rport()
4321 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_tgt_add_rport()
4329 static void ibmvfc_do_work(struct ibmvfc_host *vhost) in ibmvfc_do_work() argument
4336 ibmvfc_log_ae(vhost, vhost->events_to_log); in ibmvfc_do_work()
4337 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_do_work()
4338 vhost->events_to_log = 0; in ibmvfc_do_work()
4339 switch (vhost->action) { in ibmvfc_do_work()
4345 vhost->action = IBMVFC_HOST_ACTION_TGT_DEL; in ibmvfc_do_work()
4346 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4347 rc = ibmvfc_reset_crq(vhost); in ibmvfc_do_work()
4348 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_do_work()
4350 vio_enable_interrupts(to_vio_dev(vhost->dev)); in ibmvfc_do_work()
4351 if (rc || (rc = ibmvfc_send_crq_init(vhost)) || in ibmvfc_do_work()
4352 (rc = vio_enable_interrupts(to_vio_dev(vhost->dev)))) { in ibmvfc_do_work()
4353 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_do_work()
4354 dev_err(vhost->dev, "Error after reset (rc=%d)\n", rc); in ibmvfc_do_work()
4358 vhost->action = IBMVFC_HOST_ACTION_TGT_DEL; in ibmvfc_do_work()
4359 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4360 rc = ibmvfc_reenable_crq_queue(vhost); in ibmvfc_do_work()
4361 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_do_work()
4362 if (rc || (rc = ibmvfc_send_crq_init(vhost))) { in ibmvfc_do_work()
4363 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_do_work()
4364 dev_err(vhost->dev, "Error after enable (rc=%d)\n", rc); in ibmvfc_do_work()
4368 vhost->job_step(vhost); in ibmvfc_do_work()
4371 BUG_ON(vhost->state != IBMVFC_INITIALIZING); in ibmvfc_do_work()
4372 if (vhost->delay_init) { in ibmvfc_do_work()
4373 vhost->delay_init = 0; in ibmvfc_do_work()
4374 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4378 vhost->job_step(vhost); in ibmvfc_do_work()
4381 list_for_each_entry(tgt, &vhost->targets, queue) in ibmvfc_do_work()
4383 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY_TGTS); in ibmvfc_do_work()
4386 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_do_work()
4393 if (!ibmvfc_dev_init_to_do(vhost)) in ibmvfc_do_work()
4394 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_DEL); in ibmvfc_do_work()
4398 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_do_work()
4405 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4414 if (vhost->state == IBMVFC_INITIALIZING) { in ibmvfc_do_work()
4415 if (vhost->action == IBMVFC_HOST_ACTION_TGT_DEL_FAILED) { in ibmvfc_do_work()
4416 if (vhost->reinit) { in ibmvfc_do_work()
4417 vhost->reinit = 0; in ibmvfc_do_work()
4418 scsi_block_requests(vhost->host); in ibmvfc_do_work()
4419 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY); in ibmvfc_do_work()
4420 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4422 ibmvfc_set_host_state(vhost, IBMVFC_ACTIVE); in ibmvfc_do_work()
4423 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE); in ibmvfc_do_work()
4424 wake_up(&vhost->init_wait_q); in ibmvfc_do_work()
4425 schedule_work(&vhost->rport_add_work_q); in ibmvfc_do_work()
4426 vhost->init_retries = 0; in ibmvfc_do_work()
4427 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4428 scsi_unblock_requests(vhost->host); in ibmvfc_do_work()
4433 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT); in ibmvfc_do_work()
4434 vhost->job_step = ibmvfc_discover_targets; in ibmvfc_do_work()
4437 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE); in ibmvfc_do_work()
4438 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4439 scsi_unblock_requests(vhost->host); in ibmvfc_do_work()
4440 wake_up(&vhost->init_wait_q); in ibmvfc_do_work()
4445 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_INIT); in ibmvfc_do_work()
4446 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4447 ibmvfc_alloc_targets(vhost); in ibmvfc_do_work()
4448 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_do_work()
4451 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_do_work()
4458 if (!ibmvfc_dev_init_to_do(vhost)) in ibmvfc_do_work()
4459 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_DEL_FAILED); in ibmvfc_do_work()
4465 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4477 struct ibmvfc_host *vhost = data; in ibmvfc_work() local
4483 rc = wait_event_interruptible(vhost->work_wait_q, in ibmvfc_work()
4484 ibmvfc_work_to_do(vhost)); in ibmvfc_work()
4491 ibmvfc_do_work(vhost); in ibmvfc_work()
4494 ibmvfc_dbg(vhost, "ibmvfc kthread exiting...\n"); in ibmvfc_work()
4508 static int ibmvfc_init_crq(struct ibmvfc_host *vhost) in ibmvfc_init_crq() argument
4511 struct device *dev = vhost->dev; in ibmvfc_init_crq()
4513 struct ibmvfc_crq_queue *crq = &vhost->crq; in ibmvfc_init_crq()
4533 retrc = rc = ibmvfc_reset_crq(vhost); in ibmvfc_init_crq()
4544 tasklet_init(&vhost->tasklet, (void *)ibmvfc_tasklet, (unsigned long)vhost); in ibmvfc_init_crq()
4546 if ((rc = request_irq(vdev->irq, ibmvfc_interrupt, 0, IBMVFC_NAME, vhost))) { in ibmvfc_init_crq()
4561 tasklet_kill(&vhost->tasklet); in ibmvfc_init_crq()
4579 static void ibmvfc_free_mem(struct ibmvfc_host *vhost) in ibmvfc_free_mem() argument
4581 struct ibmvfc_async_crq_queue *async_q = &vhost->async_crq; in ibmvfc_free_mem()
4584 mempool_destroy(vhost->tgt_pool); in ibmvfc_free_mem()
4585 kfree(vhost->trace); in ibmvfc_free_mem()
4586 dma_free_coherent(vhost->dev, vhost->disc_buf_sz, vhost->disc_buf, in ibmvfc_free_mem()
4587 vhost->disc_buf_dma); in ibmvfc_free_mem()
4588 dma_free_coherent(vhost->dev, sizeof(*vhost->login_buf), in ibmvfc_free_mem()
4589 vhost->login_buf, vhost->login_buf_dma); in ibmvfc_free_mem()
4590 dma_pool_destroy(vhost->sg_pool); in ibmvfc_free_mem()
4591 dma_unmap_single(vhost->dev, async_q->msg_token, in ibmvfc_free_mem()
4604 static int ibmvfc_alloc_mem(struct ibmvfc_host *vhost) in ibmvfc_alloc_mem() argument
4606 struct ibmvfc_async_crq_queue *async_q = &vhost->async_crq; in ibmvfc_alloc_mem()
4607 struct device *dev = vhost->dev; in ibmvfc_alloc_mem()
4626 vhost->sg_pool = dma_pool_create(IBMVFC_NAME, dev, in ibmvfc_alloc_mem()
4630 if (!vhost->sg_pool) { in ibmvfc_alloc_mem()
4635 vhost->login_buf = dma_alloc_coherent(dev, sizeof(*vhost->login_buf), in ibmvfc_alloc_mem()
4636 &vhost->login_buf_dma, GFP_KERNEL); in ibmvfc_alloc_mem()
4638 if (!vhost->login_buf) { in ibmvfc_alloc_mem()
4643 vhost->disc_buf_sz = sizeof(vhost->disc_buf->scsi_id[0]) * max_targets; in ibmvfc_alloc_mem()
4644 vhost->disc_buf = dma_alloc_coherent(dev, vhost->disc_buf_sz, in ibmvfc_alloc_mem()
4645 &vhost->disc_buf_dma, GFP_KERNEL); in ibmvfc_alloc_mem()
4647 if (!vhost->disc_buf) { in ibmvfc_alloc_mem()
4652 vhost->trace = kcalloc(IBMVFC_NUM_TRACE_ENTRIES, in ibmvfc_alloc_mem()
4655 if (!vhost->trace) in ibmvfc_alloc_mem()
4658 vhost->tgt_pool = mempool_create_kmalloc_pool(IBMVFC_TGT_MEMPOOL_SZ, in ibmvfc_alloc_mem()
4661 if (!vhost->tgt_pool) { in ibmvfc_alloc_mem()
4670 kfree(vhost->trace); in ibmvfc_alloc_mem()
4672 dma_free_coherent(dev, vhost->disc_buf_sz, vhost->disc_buf, in ibmvfc_alloc_mem()
4673 vhost->disc_buf_dma); in ibmvfc_alloc_mem()
4675 dma_free_coherent(dev, sizeof(*vhost->login_buf), in ibmvfc_alloc_mem()
4676 vhost->login_buf, vhost->login_buf_dma); in ibmvfc_alloc_mem()
4678 dma_pool_destroy(vhost->sg_pool); in ibmvfc_alloc_mem()
4696 struct ibmvfc_host *vhost = container_of(work, struct ibmvfc_host, in ibmvfc_rport_add_thread() local
4704 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_rport_add_thread()
4707 if (vhost->state != IBMVFC_ACTIVE) in ibmvfc_rport_add_thread()
4710 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_rport_add_thread()
4717 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_rport_add_thread()
4720 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_rport_add_thread()
4727 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_rport_add_thread()
4733 if (vhost->state == IBMVFC_ACTIVE) in ibmvfc_rport_add_thread()
4734 vhost->scan_complete = 1; in ibmvfc_rport_add_thread()
4735 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_rport_add_thread()
4749 struct ibmvfc_host *vhost; in ibmvfc_probe() local
4755 shost = scsi_host_alloc(&driver_template, sizeof(*vhost)); in ibmvfc_probe()
4769 vhost = shost_priv(shost); in ibmvfc_probe()
4770 INIT_LIST_HEAD(&vhost->sent); in ibmvfc_probe()
4771 INIT_LIST_HEAD(&vhost->free); in ibmvfc_probe()
4772 INIT_LIST_HEAD(&vhost->targets); in ibmvfc_probe()
4773 sprintf(vhost->name, IBMVFC_NAME); in ibmvfc_probe()
4774 vhost->host = shost; in ibmvfc_probe()
4775 vhost->dev = dev; in ibmvfc_probe()
4776 vhost->partition_number = -1; in ibmvfc_probe()
4777 vhost->log_level = log_level; in ibmvfc_probe()
4778 vhost->task_set = 1; in ibmvfc_probe()
4779 strcpy(vhost->partition_name, "UNKNOWN"); in ibmvfc_probe()
4780 init_waitqueue_head(&vhost->work_wait_q); in ibmvfc_probe()
4781 init_waitqueue_head(&vhost->init_wait_q); in ibmvfc_probe()
4782 INIT_WORK(&vhost->rport_add_work_q, ibmvfc_rport_add_thread); in ibmvfc_probe()
4783 mutex_init(&vhost->passthru_mutex); in ibmvfc_probe()
4785 if ((rc = ibmvfc_alloc_mem(vhost))) in ibmvfc_probe()
4788 vhost->work_thread = kthread_run(ibmvfc_work, vhost, "%s_%d", IBMVFC_NAME, in ibmvfc_probe()
4791 if (IS_ERR(vhost->work_thread)) { in ibmvfc_probe()
4793 PTR_ERR(vhost->work_thread)); in ibmvfc_probe()
4797 if ((rc = ibmvfc_init_crq(vhost))) { in ibmvfc_probe()
4802 if ((rc = ibmvfc_init_event_pool(vhost))) { in ibmvfc_probe()
4820 dev_set_drvdata(dev, vhost); in ibmvfc_probe()
4822 list_add_tail(&vhost->queue, &ibmvfc_head); in ibmvfc_probe()
4825 ibmvfc_send_crq_init(vhost); in ibmvfc_probe()
4832 ibmvfc_free_event_pool(vhost); in ibmvfc_probe()
4834 ibmvfc_release_crq_queue(vhost); in ibmvfc_probe()
4836 kthread_stop(vhost->work_thread); in ibmvfc_probe()
4838 ibmvfc_free_mem(vhost); in ibmvfc_probe()
4855 struct ibmvfc_host *vhost = dev_get_drvdata(&vdev->dev); in ibmvfc_remove() local
4859 ibmvfc_remove_trace_file(&vhost->host->shost_dev.kobj, &ibmvfc_trace_attr); in ibmvfc_remove()
4861 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_remove()
4862 ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE); in ibmvfc_remove()
4863 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_remove()
4865 ibmvfc_wait_while_resetting(vhost); in ibmvfc_remove()
4866 ibmvfc_release_crq_queue(vhost); in ibmvfc_remove()
4867 kthread_stop(vhost->work_thread); in ibmvfc_remove()
4868 fc_remove_host(vhost->host); in ibmvfc_remove()
4869 scsi_remove_host(vhost->host); in ibmvfc_remove()
4871 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_remove()
4872 ibmvfc_purge_requests(vhost, DID_ERROR); in ibmvfc_remove()
4873 ibmvfc_free_event_pool(vhost); in ibmvfc_remove()
4874 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_remove()
4876 ibmvfc_free_mem(vhost); in ibmvfc_remove()
4878 list_del(&vhost->queue); in ibmvfc_remove()
4880 scsi_host_put(vhost->host); in ibmvfc_remove()
4896 struct ibmvfc_host *vhost = dev_get_drvdata(dev); in ibmvfc_resume() local
4899 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_resume()
4901 tasklet_schedule(&vhost->tasklet); in ibmvfc_resume()
4902 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_resume()