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()
3109 static struct ibmvfc_async_crq *ibmvfc_next_async_crq(struct ibmvfc_host *vhost) in ibmvfc_next_async_crq() argument
3111 struct ibmvfc_async_crq_queue *async_crq = &vhost->async_crq; in ibmvfc_next_async_crq()
3132 static struct ibmvfc_crq *ibmvfc_next_crq(struct ibmvfc_host *vhost) in ibmvfc_next_crq() argument
3134 struct ibmvfc_crq_queue *queue = &vhost->crq; in ibmvfc_next_crq()
3158 struct ibmvfc_host *vhost = (struct ibmvfc_host *)dev_instance; in ibmvfc_interrupt() local
3161 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_interrupt()
3162 vio_disable_interrupts(to_vio_dev(vhost->dev)); in ibmvfc_interrupt()
3163 tasklet_schedule(&vhost->tasklet); in ibmvfc_interrupt()
3164 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_interrupt()
3177 struct ibmvfc_host *vhost = data; in ibmvfc_tasklet() local
3178 struct vio_dev *vdev = to_vio_dev(vhost->dev); in ibmvfc_tasklet()
3184 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_tasklet()
3187 while ((async = ibmvfc_next_async_crq(vhost)) != NULL) { in ibmvfc_tasklet()
3188 ibmvfc_handle_async(async, vhost); in ibmvfc_tasklet()
3194 while ((crq = ibmvfc_next_crq(vhost)) != NULL) { in ibmvfc_tasklet()
3195 ibmvfc_handle_crq(crq, vhost); in ibmvfc_tasklet()
3201 if ((async = ibmvfc_next_async_crq(vhost)) != NULL) { in ibmvfc_tasklet()
3203 ibmvfc_handle_async(async, vhost); in ibmvfc_tasklet()
3206 } else if ((crq = ibmvfc_next_crq(vhost)) != NULL) { in ibmvfc_tasklet()
3208 ibmvfc_handle_crq(crq, vhost); in ibmvfc_tasklet()
3215 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_tasklet()
3229 wake_up(&tgt->vhost->work_wait_q); in ibmvfc_init_tgt()
3245 wake_up(&tgt->vhost->work_wait_q); in ibmvfc_retry_tgt_init()
3294 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_prli_done() local
3300 vhost->discovery_threads--; in ibmvfc_tgt_prli_done()
3352 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_prli_done()
3363 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_send_prli() local
3366 if (vhost->discovery_threads >= disc_threads) in ibmvfc_tgt_send_prli()
3370 evt = ibmvfc_get_event(vhost); in ibmvfc_tgt_send_prli()
3371 vhost->discovery_threads++; in ibmvfc_tgt_send_prli()
3386 if (ibmvfc_send_event(evt, vhost, default_timeout)) { in ibmvfc_tgt_send_prli()
3387 vhost->discovery_threads--; in ibmvfc_tgt_send_prli()
3402 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_plogi_done() local
3407 vhost->discovery_threads--; in ibmvfc_tgt_plogi_done()
3414 vhost->reinit = 1; in ibmvfc_tgt_plogi_done()
3448 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_plogi_done()
3459 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_send_plogi() local
3462 if (vhost->discovery_threads >= disc_threads) in ibmvfc_tgt_send_plogi()
3467 evt = ibmvfc_get_event(vhost); in ibmvfc_tgt_send_plogi()
3468 vhost->discovery_threads++; in ibmvfc_tgt_send_plogi()
3479 if (ibmvfc_send_event(evt, vhost, default_timeout)) { in ibmvfc_tgt_send_plogi()
3480 vhost->discovery_threads--; in ibmvfc_tgt_send_plogi()
3495 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_implicit_logout_done() local
3499 vhost->discovery_threads--; in ibmvfc_tgt_implicit_logout_done()
3509 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_implicit_logout_done()
3517 if (vhost->action == IBMVFC_HOST_ACTION_TGT_INIT) in ibmvfc_tgt_implicit_logout_done()
3519 else if (vhost->action == IBMVFC_HOST_ACTION_QUERY_TGTS && in ibmvfc_tgt_implicit_logout_done()
3523 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_implicit_logout_done()
3534 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_implicit_logout() local
3537 if (vhost->discovery_threads >= disc_threads) in ibmvfc_tgt_implicit_logout()
3541 evt = ibmvfc_get_event(vhost); in ibmvfc_tgt_implicit_logout()
3542 vhost->discovery_threads++; in ibmvfc_tgt_implicit_logout()
3553 if (ibmvfc_send_event(evt, vhost, default_timeout)) { in ibmvfc_tgt_implicit_logout()
3554 vhost->discovery_threads--; in ibmvfc_tgt_implicit_logout()
3591 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_adisc_done() local
3596 vhost->discovery_threads--; in ibmvfc_tgt_adisc_done()
3623 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_adisc_done()
3666 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_adisc_cancel_done() local
3670 vhost->abort_threads--; in ibmvfc_tgt_adisc_cancel_done()
3673 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_adisc_cancel_done()
3686 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_adisc_timeout() local
3693 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_adisc_timeout()
3694 if (vhost->abort_threads >= disc_threads || in ibmvfc_adisc_timeout()
3696 vhost->state != IBMVFC_INITIALIZING || in ibmvfc_adisc_timeout()
3697 vhost->action != IBMVFC_HOST_ACTION_QUERY_TGTS) { in ibmvfc_adisc_timeout()
3698 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_adisc_timeout()
3702 vhost->abort_threads++; in ibmvfc_adisc_timeout()
3704 evt = ibmvfc_get_event(vhost); in ibmvfc_adisc_timeout()
3716 rc = ibmvfc_send_event(evt, vhost, default_timeout); in ibmvfc_adisc_timeout()
3720 vhost->abort_threads--; in ibmvfc_adisc_timeout()
3722 __ibmvfc_reset_host(vhost); in ibmvfc_adisc_timeout()
3725 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_adisc_timeout()
3742 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_adisc() local
3745 if (vhost->discovery_threads >= disc_threads) in ibmvfc_tgt_adisc()
3749 evt = ibmvfc_get_event(vhost); in ibmvfc_tgt_adisc()
3750 vhost->discovery_threads++; in ibmvfc_tgt_adisc()
3761 memcpy(&mad->fc_iu.payload[2], &vhost->login_buf->resp.port_name, in ibmvfc_tgt_adisc()
3762 sizeof(vhost->login_buf->resp.port_name)); in ibmvfc_tgt_adisc()
3763 memcpy(&mad->fc_iu.payload[4], &vhost->login_buf->resp.node_name, in ibmvfc_tgt_adisc()
3764 sizeof(vhost->login_buf->resp.node_name)); in ibmvfc_tgt_adisc()
3765 mad->fc_iu.payload[6] = cpu_to_be32(be64_to_cpu(vhost->login_buf->resp.scsi_id) & 0x00ffffff); in ibmvfc_tgt_adisc()
3777 if (ibmvfc_send_event(evt, vhost, IBMVFC_ADISC_PLUS_CANCEL_TIMEOUT)) { in ibmvfc_tgt_adisc()
3778 vhost->discovery_threads--; in ibmvfc_tgt_adisc()
3794 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_tgt_query_target_done() local
3799 vhost->discovery_threads--; in ibmvfc_tgt_query_target_done()
3836 wake_up(&vhost->work_wait_q); in ibmvfc_tgt_query_target_done()
3847 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_query_target() local
3850 if (vhost->discovery_threads >= disc_threads) in ibmvfc_tgt_query_target()
3854 evt = ibmvfc_get_event(vhost); in ibmvfc_tgt_query_target()
3855 vhost->discovery_threads++; in ibmvfc_tgt_query_target()
3866 if (ibmvfc_send_event(evt, vhost, default_timeout)) { in ibmvfc_tgt_query_target()
3867 vhost->discovery_threads--; in ibmvfc_tgt_query_target()
3882 static int ibmvfc_alloc_target(struct ibmvfc_host *vhost, u64 scsi_id) in ibmvfc_alloc_target() argument
3887 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_alloc_target()
3888 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_alloc_target()
3895 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_alloc_target()
3897 tgt = mempool_alloc(vhost->tgt_pool, GFP_NOIO); in ibmvfc_alloc_target()
3899 dev_err(vhost->dev, "Target allocation failure for scsi id %08llx\n", in ibmvfc_alloc_target()
3907 tgt->vhost = vhost; in ibmvfc_alloc_target()
3909 tgt->cancel_key = vhost->task_set++; in ibmvfc_alloc_target()
3913 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_alloc_target()
3914 list_add_tail(&tgt->queue, &vhost->targets); in ibmvfc_alloc_target()
3917 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_alloc_target()
3928 static int ibmvfc_alloc_targets(struct ibmvfc_host *vhost) in ibmvfc_alloc_targets() argument
3932 for (i = 0, rc = 0; !rc && i < vhost->num_targets; i++) in ibmvfc_alloc_targets()
3933 rc = ibmvfc_alloc_target(vhost, in ibmvfc_alloc_targets()
3934 be32_to_cpu(vhost->disc_buf->scsi_id[i]) & in ibmvfc_alloc_targets()
3947 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_discover_targets_done() local
3954 ibmvfc_dbg(vhost, "Discover Targets succeeded\n"); in ibmvfc_discover_targets_done()
3955 vhost->num_targets = be32_to_cpu(rsp->num_written); in ibmvfc_discover_targets_done()
3956 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_ALLOC_TGTS); in ibmvfc_discover_targets_done()
3959 level += ibmvfc_retry_host_init(vhost); in ibmvfc_discover_targets_done()
3960 ibmvfc_log(vhost, level, "Discover Targets failed: %s (%x:%x)\n", in ibmvfc_discover_targets_done()
3967 dev_err(vhost->dev, "Invalid Discover Targets response: 0x%x\n", mad_status); in ibmvfc_discover_targets_done()
3968 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_discover_targets_done()
3973 wake_up(&vhost->work_wait_q); in ibmvfc_discover_targets_done()
3981 static void ibmvfc_discover_targets(struct ibmvfc_host *vhost) in ibmvfc_discover_targets() argument
3984 struct ibmvfc_event *evt = ibmvfc_get_event(vhost); in ibmvfc_discover_targets()
3992 mad->bufflen = cpu_to_be32(vhost->disc_buf_sz); in ibmvfc_discover_targets()
3993 mad->buffer.va = cpu_to_be64(vhost->disc_buf_dma); in ibmvfc_discover_targets()
3994 mad->buffer.len = cpu_to_be32(vhost->disc_buf_sz); in ibmvfc_discover_targets()
3995 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT_WAIT); in ibmvfc_discover_targets()
3997 if (!ibmvfc_send_event(evt, vhost, default_timeout)) in ibmvfc_discover_targets()
3998 ibmvfc_dbg(vhost, "Sent discover targets\n"); in ibmvfc_discover_targets()
4000 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_discover_targets()
4010 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_npiv_login_done() local
4012 struct ibmvfc_npiv_login_resp *rsp = &vhost->login_buf->resp; in ibmvfc_npiv_login_done()
4022 level += ibmvfc_retry_host_init(vhost); in ibmvfc_npiv_login_done()
4024 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_npiv_login_done()
4025 ibmvfc_log(vhost, level, "NPIV Login failed: %s (%x:%x)\n", in ibmvfc_npiv_login_done()
4031 ibmvfc_retry_host_init(vhost); in ibmvfc_npiv_login_done()
4036 dev_err(vhost->dev, "Invalid NPIV Login response: 0x%x\n", mad_status); in ibmvfc_npiv_login_done()
4037 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_npiv_login_done()
4042 vhost->client_migrated = 0; in ibmvfc_npiv_login_done()
4045 dev_err(vhost->dev, "Virtual adapter does not support FC. %x\n", in ibmvfc_npiv_login_done()
4047 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_npiv_login_done()
4048 wake_up(&vhost->work_wait_q); in ibmvfc_npiv_login_done()
4053 dev_err(vhost->dev, "Virtual adapter supported queue depth too small: %d\n", in ibmvfc_npiv_login_done()
4055 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_npiv_login_done()
4056 wake_up(&vhost->work_wait_q); in ibmvfc_npiv_login_done()
4060 vhost->logged_in = 1; in ibmvfc_npiv_login_done()
4062 dev_info(vhost->dev, "Host partition: %s, device: %s %s %s max sectors %u\n", in ibmvfc_npiv_login_done()
4066 fc_host_fabric_name(vhost->host) = be64_to_cpu(rsp->node_name); in ibmvfc_npiv_login_done()
4067 fc_host_node_name(vhost->host) = be64_to_cpu(rsp->node_name); in ibmvfc_npiv_login_done()
4068 fc_host_port_name(vhost->host) = be64_to_cpu(rsp->port_name); in ibmvfc_npiv_login_done()
4069 fc_host_port_id(vhost->host) = be64_to_cpu(rsp->scsi_id); in ibmvfc_npiv_login_done()
4070 fc_host_port_type(vhost->host) = FC_PORTTYPE_NPIV; in ibmvfc_npiv_login_done()
4071 fc_host_supported_classes(vhost->host) = 0; in ibmvfc_npiv_login_done()
4073 fc_host_supported_classes(vhost->host) |= FC_COS_CLASS1; in ibmvfc_npiv_login_done()
4075 fc_host_supported_classes(vhost->host) |= FC_COS_CLASS2; in ibmvfc_npiv_login_done()
4077 fc_host_supported_classes(vhost->host) |= FC_COS_CLASS3; in ibmvfc_npiv_login_done()
4078 fc_host_maxframe_size(vhost->host) = in ibmvfc_npiv_login_done()
4081 vhost->host->can_queue = be32_to_cpu(rsp->max_cmds) - IBMVFC_NUM_INTERNAL_REQ; in ibmvfc_npiv_login_done()
4082 vhost->host->max_sectors = npiv_max_sectors; in ibmvfc_npiv_login_done()
4083 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY); in ibmvfc_npiv_login_done()
4084 wake_up(&vhost->work_wait_q); in ibmvfc_npiv_login_done()
4092 static void ibmvfc_npiv_login(struct ibmvfc_host *vhost) in ibmvfc_npiv_login() argument
4095 struct ibmvfc_event *evt = ibmvfc_get_event(vhost); in ibmvfc_npiv_login()
4097 ibmvfc_gather_partition_info(vhost); in ibmvfc_npiv_login()
4098 ibmvfc_set_login_info(vhost); in ibmvfc_npiv_login()
4101 memcpy(vhost->login_buf, &vhost->login_info, sizeof(vhost->login_info)); in ibmvfc_npiv_login()
4107 mad->buffer.va = cpu_to_be64(vhost->login_buf_dma); in ibmvfc_npiv_login()
4108 mad->buffer.len = cpu_to_be32(sizeof(*vhost->login_buf)); in ibmvfc_npiv_login()
4110 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT_WAIT); in ibmvfc_npiv_login()
4112 if (!ibmvfc_send_event(evt, vhost, default_timeout)) in ibmvfc_npiv_login()
4113 ibmvfc_dbg(vhost, "Sent NPIV login\n"); in ibmvfc_npiv_login()
4115 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_npiv_login()
4125 struct ibmvfc_host *vhost = evt->vhost; in ibmvfc_npiv_logout_done() local
4132 if (list_empty(&vhost->sent) && in ibmvfc_npiv_logout_done()
4133 vhost->action == IBMVFC_HOST_ACTION_LOGO_WAIT) { in ibmvfc_npiv_logout_done()
4134 ibmvfc_init_host(vhost); in ibmvfc_npiv_logout_done()
4143 ibmvfc_dbg(vhost, "NPIV Logout failed. 0x%X\n", mad_status); in ibmvfc_npiv_logout_done()
4147 ibmvfc_hard_reset_host(vhost); in ibmvfc_npiv_logout_done()
4155 static void ibmvfc_npiv_logout(struct ibmvfc_host *vhost) in ibmvfc_npiv_logout() argument
4160 evt = ibmvfc_get_event(vhost); in ibmvfc_npiv_logout()
4169 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_LOGO_WAIT); in ibmvfc_npiv_logout()
4171 if (!ibmvfc_send_event(evt, vhost, default_timeout)) in ibmvfc_npiv_logout()
4172 ibmvfc_dbg(vhost, "Sent NPIV logout\n"); in ibmvfc_npiv_logout()
4174 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_npiv_logout()
4184 static int ibmvfc_dev_init_to_do(struct ibmvfc_host *vhost) in ibmvfc_dev_init_to_do() argument
4188 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_dev_init_to_do()
4204 static int __ibmvfc_work_to_do(struct ibmvfc_host *vhost) in __ibmvfc_work_to_do() argument
4210 switch (vhost->action) { in __ibmvfc_work_to_do()
4217 if (vhost->discovery_threads == disc_threads) in __ibmvfc_work_to_do()
4219 list_for_each_entry(tgt, &vhost->targets, queue) in __ibmvfc_work_to_do()
4222 list_for_each_entry(tgt, &vhost->targets, queue) in __ibmvfc_work_to_do()
4248 static int ibmvfc_work_to_do(struct ibmvfc_host *vhost) in ibmvfc_work_to_do() argument
4253 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_work_to_do()
4254 rc = __ibmvfc_work_to_do(vhost); in ibmvfc_work_to_do()
4255 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_work_to_do()
4265 static void ibmvfc_log_ae(struct ibmvfc_host *vhost, int events) in ibmvfc_log_ae() argument
4268 fc_host_post_event(vhost->host, fc_get_event_number(), FCH_EVT_RSCN, 0); in ibmvfc_log_ae()
4270 vhost->state >= IBMVFC_HALTED) in ibmvfc_log_ae()
4271 fc_host_post_event(vhost->host, fc_get_event_number(), FCH_EVT_LINKDOWN, 0); in ibmvfc_log_ae()
4273 vhost->state == IBMVFC_INITIALIZING) in ibmvfc_log_ae()
4274 fc_host_post_event(vhost->host, fc_get_event_number(), FCH_EVT_LINKUP, 0); in ibmvfc_log_ae()
4284 struct ibmvfc_host *vhost = tgt->vhost; in ibmvfc_tgt_add_rport() local
4289 rport = fc_remote_port_add(vhost->host, 0, &tgt->ids); in ibmvfc_tgt_add_rport()
4290 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_tgt_add_rport()
4296 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_tgt_add_rport()
4302 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_tgt_add_rport()
4322 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_tgt_add_rport()
4330 static void ibmvfc_do_work(struct ibmvfc_host *vhost) in ibmvfc_do_work() argument
4337 ibmvfc_log_ae(vhost, vhost->events_to_log); in ibmvfc_do_work()
4338 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_do_work()
4339 vhost->events_to_log = 0; in ibmvfc_do_work()
4340 switch (vhost->action) { in ibmvfc_do_work()
4346 vhost->action = IBMVFC_HOST_ACTION_TGT_DEL; in ibmvfc_do_work()
4347 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4348 rc = ibmvfc_reset_crq(vhost); in ibmvfc_do_work()
4349 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_do_work()
4351 vio_enable_interrupts(to_vio_dev(vhost->dev)); in ibmvfc_do_work()
4352 if (rc || (rc = ibmvfc_send_crq_init(vhost)) || in ibmvfc_do_work()
4353 (rc = vio_enable_interrupts(to_vio_dev(vhost->dev)))) { in ibmvfc_do_work()
4354 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_do_work()
4355 dev_err(vhost->dev, "Error after reset (rc=%d)\n", rc); in ibmvfc_do_work()
4359 vhost->action = IBMVFC_HOST_ACTION_TGT_DEL; in ibmvfc_do_work()
4360 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4361 rc = ibmvfc_reenable_crq_queue(vhost); in ibmvfc_do_work()
4362 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_do_work()
4363 if (rc || (rc = ibmvfc_send_crq_init(vhost))) { in ibmvfc_do_work()
4364 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD); in ibmvfc_do_work()
4365 dev_err(vhost->dev, "Error after enable (rc=%d)\n", rc); in ibmvfc_do_work()
4369 vhost->job_step(vhost); in ibmvfc_do_work()
4372 BUG_ON(vhost->state != IBMVFC_INITIALIZING); in ibmvfc_do_work()
4373 if (vhost->delay_init) { in ibmvfc_do_work()
4374 vhost->delay_init = 0; in ibmvfc_do_work()
4375 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4379 vhost->job_step(vhost); in ibmvfc_do_work()
4382 list_for_each_entry(tgt, &vhost->targets, queue) in ibmvfc_do_work()
4384 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY_TGTS); in ibmvfc_do_work()
4387 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_do_work()
4394 if (!ibmvfc_dev_init_to_do(vhost)) in ibmvfc_do_work()
4395 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_DEL); in ibmvfc_do_work()
4399 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_do_work()
4406 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4415 if (vhost->state == IBMVFC_INITIALIZING) { in ibmvfc_do_work()
4416 if (vhost->action == IBMVFC_HOST_ACTION_TGT_DEL_FAILED) { in ibmvfc_do_work()
4417 if (vhost->reinit) { in ibmvfc_do_work()
4418 vhost->reinit = 0; in ibmvfc_do_work()
4419 scsi_block_requests(vhost->host); in ibmvfc_do_work()
4420 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY); in ibmvfc_do_work()
4421 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4423 ibmvfc_set_host_state(vhost, IBMVFC_ACTIVE); in ibmvfc_do_work()
4424 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE); in ibmvfc_do_work()
4425 wake_up(&vhost->init_wait_q); in ibmvfc_do_work()
4426 schedule_work(&vhost->rport_add_work_q); in ibmvfc_do_work()
4427 vhost->init_retries = 0; in ibmvfc_do_work()
4428 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4429 scsi_unblock_requests(vhost->host); in ibmvfc_do_work()
4434 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT); in ibmvfc_do_work()
4435 vhost->job_step = ibmvfc_discover_targets; in ibmvfc_do_work()
4438 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE); in ibmvfc_do_work()
4439 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4440 scsi_unblock_requests(vhost->host); in ibmvfc_do_work()
4441 wake_up(&vhost->init_wait_q); in ibmvfc_do_work()
4446 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_INIT); in ibmvfc_do_work()
4447 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4448 ibmvfc_alloc_targets(vhost); in ibmvfc_do_work()
4449 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_do_work()
4452 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_do_work()
4459 if (!ibmvfc_dev_init_to_do(vhost)) in ibmvfc_do_work()
4460 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_DEL_FAILED); in ibmvfc_do_work()
4466 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_do_work()
4478 struct ibmvfc_host *vhost = data; in ibmvfc_work() local
4484 rc = wait_event_interruptible(vhost->work_wait_q, in ibmvfc_work()
4485 ibmvfc_work_to_do(vhost)); in ibmvfc_work()
4492 ibmvfc_do_work(vhost); in ibmvfc_work()
4495 ibmvfc_dbg(vhost, "ibmvfc kthread exiting...\n"); in ibmvfc_work()
4509 static int ibmvfc_init_crq(struct ibmvfc_host *vhost) in ibmvfc_init_crq() argument
4512 struct device *dev = vhost->dev; in ibmvfc_init_crq()
4514 struct ibmvfc_crq_queue *crq = &vhost->crq; in ibmvfc_init_crq()
4534 retrc = rc = ibmvfc_reset_crq(vhost); in ibmvfc_init_crq()
4545 tasklet_init(&vhost->tasklet, (void *)ibmvfc_tasklet, (unsigned long)vhost); in ibmvfc_init_crq()
4547 if ((rc = request_irq(vdev->irq, ibmvfc_interrupt, 0, IBMVFC_NAME, vhost))) { in ibmvfc_init_crq()
4562 tasklet_kill(&vhost->tasklet); in ibmvfc_init_crq()
4580 static void ibmvfc_free_mem(struct ibmvfc_host *vhost) in ibmvfc_free_mem() argument
4582 struct ibmvfc_async_crq_queue *async_q = &vhost->async_crq; in ibmvfc_free_mem()
4585 mempool_destroy(vhost->tgt_pool); in ibmvfc_free_mem()
4586 kfree(vhost->trace); in ibmvfc_free_mem()
4587 dma_free_coherent(vhost->dev, vhost->disc_buf_sz, vhost->disc_buf, in ibmvfc_free_mem()
4588 vhost->disc_buf_dma); in ibmvfc_free_mem()
4589 dma_free_coherent(vhost->dev, sizeof(*vhost->login_buf), in ibmvfc_free_mem()
4590 vhost->login_buf, vhost->login_buf_dma); in ibmvfc_free_mem()
4591 dma_pool_destroy(vhost->sg_pool); in ibmvfc_free_mem()
4592 dma_unmap_single(vhost->dev, async_q->msg_token, in ibmvfc_free_mem()
4605 static int ibmvfc_alloc_mem(struct ibmvfc_host *vhost) in ibmvfc_alloc_mem() argument
4607 struct ibmvfc_async_crq_queue *async_q = &vhost->async_crq; in ibmvfc_alloc_mem()
4608 struct device *dev = vhost->dev; in ibmvfc_alloc_mem()
4627 vhost->sg_pool = dma_pool_create(IBMVFC_NAME, dev, in ibmvfc_alloc_mem()
4631 if (!vhost->sg_pool) { in ibmvfc_alloc_mem()
4636 vhost->login_buf = dma_alloc_coherent(dev, sizeof(*vhost->login_buf), in ibmvfc_alloc_mem()
4637 &vhost->login_buf_dma, GFP_KERNEL); in ibmvfc_alloc_mem()
4639 if (!vhost->login_buf) { in ibmvfc_alloc_mem()
4644 vhost->disc_buf_sz = sizeof(vhost->disc_buf->scsi_id[0]) * max_targets; in ibmvfc_alloc_mem()
4645 vhost->disc_buf = dma_alloc_coherent(dev, vhost->disc_buf_sz, in ibmvfc_alloc_mem()
4646 &vhost->disc_buf_dma, GFP_KERNEL); in ibmvfc_alloc_mem()
4648 if (!vhost->disc_buf) { in ibmvfc_alloc_mem()
4653 vhost->trace = kcalloc(IBMVFC_NUM_TRACE_ENTRIES, in ibmvfc_alloc_mem()
4656 if (!vhost->trace) in ibmvfc_alloc_mem()
4659 vhost->tgt_pool = mempool_create_kmalloc_pool(IBMVFC_TGT_MEMPOOL_SZ, in ibmvfc_alloc_mem()
4662 if (!vhost->tgt_pool) { in ibmvfc_alloc_mem()
4671 kfree(vhost->trace); in ibmvfc_alloc_mem()
4673 dma_free_coherent(dev, vhost->disc_buf_sz, vhost->disc_buf, in ibmvfc_alloc_mem()
4674 vhost->disc_buf_dma); in ibmvfc_alloc_mem()
4676 dma_free_coherent(dev, sizeof(*vhost->login_buf), in ibmvfc_alloc_mem()
4677 vhost->login_buf, vhost->login_buf_dma); in ibmvfc_alloc_mem()
4679 dma_pool_destroy(vhost->sg_pool); in ibmvfc_alloc_mem()
4697 struct ibmvfc_host *vhost = container_of(work, struct ibmvfc_host, in ibmvfc_rport_add_thread() local
4705 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_rport_add_thread()
4708 if (vhost->state != IBMVFC_ACTIVE) in ibmvfc_rport_add_thread()
4711 list_for_each_entry(tgt, &vhost->targets, queue) { in ibmvfc_rport_add_thread()
4718 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_rport_add_thread()
4721 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_rport_add_thread()
4728 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_rport_add_thread()
4734 if (vhost->state == IBMVFC_ACTIVE) in ibmvfc_rport_add_thread()
4735 vhost->scan_complete = 1; in ibmvfc_rport_add_thread()
4736 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_rport_add_thread()
4750 struct ibmvfc_host *vhost; in ibmvfc_probe() local
4756 shost = scsi_host_alloc(&driver_template, sizeof(*vhost)); in ibmvfc_probe()
4770 vhost = shost_priv(shost); in ibmvfc_probe()
4771 INIT_LIST_HEAD(&vhost->sent); in ibmvfc_probe()
4772 INIT_LIST_HEAD(&vhost->free); in ibmvfc_probe()
4773 INIT_LIST_HEAD(&vhost->targets); in ibmvfc_probe()
4774 sprintf(vhost->name, IBMVFC_NAME); in ibmvfc_probe()
4775 vhost->host = shost; in ibmvfc_probe()
4776 vhost->dev = dev; in ibmvfc_probe()
4777 vhost->partition_number = -1; in ibmvfc_probe()
4778 vhost->log_level = log_level; in ibmvfc_probe()
4779 vhost->task_set = 1; in ibmvfc_probe()
4780 strcpy(vhost->partition_name, "UNKNOWN"); in ibmvfc_probe()
4781 init_waitqueue_head(&vhost->work_wait_q); in ibmvfc_probe()
4782 init_waitqueue_head(&vhost->init_wait_q); in ibmvfc_probe()
4783 INIT_WORK(&vhost->rport_add_work_q, ibmvfc_rport_add_thread); in ibmvfc_probe()
4784 mutex_init(&vhost->passthru_mutex); in ibmvfc_probe()
4786 if ((rc = ibmvfc_alloc_mem(vhost))) in ibmvfc_probe()
4789 vhost->work_thread = kthread_run(ibmvfc_work, vhost, "%s_%d", IBMVFC_NAME, in ibmvfc_probe()
4792 if (IS_ERR(vhost->work_thread)) { in ibmvfc_probe()
4794 PTR_ERR(vhost->work_thread)); in ibmvfc_probe()
4798 if ((rc = ibmvfc_init_crq(vhost))) { in ibmvfc_probe()
4803 if ((rc = ibmvfc_init_event_pool(vhost))) { in ibmvfc_probe()
4821 dev_set_drvdata(dev, vhost); in ibmvfc_probe()
4823 list_add_tail(&vhost->queue, &ibmvfc_head); in ibmvfc_probe()
4826 ibmvfc_send_crq_init(vhost); in ibmvfc_probe()
4833 ibmvfc_free_event_pool(vhost); in ibmvfc_probe()
4835 ibmvfc_release_crq_queue(vhost); in ibmvfc_probe()
4837 kthread_stop(vhost->work_thread); in ibmvfc_probe()
4839 ibmvfc_free_mem(vhost); in ibmvfc_probe()
4856 struct ibmvfc_host *vhost = dev_get_drvdata(&vdev->dev); in ibmvfc_remove() local
4860 ibmvfc_remove_trace_file(&vhost->host->shost_dev.kobj, &ibmvfc_trace_attr); in ibmvfc_remove()
4862 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_remove()
4863 ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE); in ibmvfc_remove()
4864 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_remove()
4866 ibmvfc_wait_while_resetting(vhost); in ibmvfc_remove()
4867 ibmvfc_release_crq_queue(vhost); in ibmvfc_remove()
4868 kthread_stop(vhost->work_thread); in ibmvfc_remove()
4869 fc_remove_host(vhost->host); in ibmvfc_remove()
4870 scsi_remove_host(vhost->host); in ibmvfc_remove()
4872 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_remove()
4873 ibmvfc_purge_requests(vhost, DID_ERROR); in ibmvfc_remove()
4874 ibmvfc_free_event_pool(vhost); in ibmvfc_remove()
4875 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_remove()
4877 ibmvfc_free_mem(vhost); in ibmvfc_remove()
4879 list_del(&vhost->queue); in ibmvfc_remove()
4881 scsi_host_put(vhost->host); in ibmvfc_remove()
4897 struct ibmvfc_host *vhost = dev_get_drvdata(dev); in ibmvfc_resume() local
4900 spin_lock_irqsave(vhost->host->host_lock, flags); in ibmvfc_resume()
4902 tasklet_schedule(&vhost->tasklet); in ibmvfc_resume()
4903 spin_unlock_irqrestore(vhost->host->host_lock, flags); in ibmvfc_resume()