Lines Matching refs:hostdata

128  * @hostdata:	ibmvscsi_host_data who owns the event pool
133 int size, struct ibmvscsi_host_data *hostdata)
144 dma_alloc_coherent(hostdata->dev,
161 evt->hostdata = hostdata;
172 * @hostdata: ibmvscsi_host_data who owns the even pool
177 struct ibmvscsi_host_data *hostdata)
184 dma_free_coherent(hostdata->dev,
191 dev_warn(hostdata->dev, "releasing event pool with %d "
194 dma_free_coherent(hostdata->dev,
227 dev_err(evt->hostdata->dev, "Freeing invalid event_struct %p "
232 dev_err(evt->hostdata->dev, "Freeing event_struct %p "
467 * @hostdata: the adapter
469 static void purge_requests(struct ibmvscsi_host_data *hostdata, int error_code)
474 spin_lock_irqsave(hostdata->host->host_lock, flags);
475 while (!list_empty(&hostdata->sent)) {
476 evt = list_first_entry(&hostdata->sent, struct srp_event_struct, list);
480 spin_unlock_irqrestore(hostdata->host->host_lock, flags);
484 evt->hostdata->dev);
489 free_event_struct(&evt->hostdata->pool, evt);
490 spin_lock_irqsave(hostdata->host->host_lock, flags);
492 spin_unlock_irqrestore(hostdata->host->host_lock, flags);
497 * @hostdata: struct ibmvscsi_host_data to reset
499 static void ibmvscsi_reset_host(struct ibmvscsi_host_data *hostdata)
501 scsi_block_requests(hostdata->host);
502 atomic_set(&hostdata->request_limit, 0);
504 purge_requests(hostdata, DID_ERROR);
505 hostdata->reset_crq = 1;
506 wake_up(&hostdata->work_wait_q);
517 struct ibmvscsi_host_data *hostdata = evt_struct->hostdata;
519 dev_err(hostdata->dev, "Command timed out (%x). Resetting connection\n",
522 ibmvscsi_reset_host(hostdata);
532 * @hostdata: ibmvscsi_host_data of host
539 struct ibmvscsi_host_data *hostdata,
556 atomic_dec_if_positive(&hostdata->request_limit);
586 list_for_each_entry(tmp_evt, &hostdata->sent, list) {
603 list_add_tail(&evt_struct->list, &hostdata->sent);
614 ibmvscsi_ops->send_crq(hostdata, crq_as_u64[0], crq_as_u64[1])) != 0) {
624 dev_warn(hostdata->dev, "send warning. "
628 dev_err(hostdata->dev, "send error %d\n", rc);
630 atomic_inc(&hostdata->request_limit);
637 unmap_cmd_data(&evt_struct->iu.srp.cmd, evt_struct, hostdata->dev);
639 free_event_struct(&hostdata->pool, evt_struct);
641 atomic_inc(&hostdata->request_limit);
645 unmap_cmd_data(&evt_struct->iu.srp.cmd, evt_struct, hostdata->dev);
653 free_event_struct(&hostdata->pool, evt_struct);
671 dev_warn(evt_struct->hostdata->dev,
683 evt_struct->hostdata->dev);
716 struct ibmvscsi_host_data *hostdata = shost_priv(cmnd->device->host);
721 evt_struct = get_event_struct(&hostdata->pool);
732 if (!map_data_for_srp_cmd(cmnd, evt_struct, srp_cmd, hostdata->dev)) {
736 free_event_struct(&hostdata->pool, evt_struct);
760 return ibmvscsi_send_srp_event(evt_struct, hostdata, 0);
771 * @hostdata: ibmvscsi_host_data of host
776 static int map_persist_bufs(struct ibmvscsi_host_data *hostdata)
779 hostdata->caps_addr = dma_map_single(hostdata->dev, &hostdata->caps,
780 sizeof(hostdata->caps), DMA_BIDIRECTIONAL);
782 if (dma_mapping_error(hostdata->dev, hostdata->caps_addr)) {
783 dev_err(hostdata->dev, "Unable to map capabilities buffer!\n");
787 hostdata->adapter_info_addr = dma_map_single(hostdata->dev,
788 &hostdata->madapter_info,
789 sizeof(hostdata->madapter_info),
791 if (dma_mapping_error(hostdata->dev, hostdata->adapter_info_addr)) {
792 dev_err(hostdata->dev, "Unable to map adapter info buffer!\n");
793 dma_unmap_single(hostdata->dev, hostdata->caps_addr,
794 sizeof(hostdata->caps), DMA_BIDIRECTIONAL);
803 * @hostdata: ibmvscsi_host_data of host
807 static void unmap_persist_bufs(struct ibmvscsi_host_data *hostdata)
809 dma_unmap_single(hostdata->dev, hostdata->caps_addr,
810 sizeof(hostdata->caps), DMA_BIDIRECTIONAL);
812 dma_unmap_single(hostdata->dev, hostdata->adapter_info_addr,
813 sizeof(hostdata->madapter_info), DMA_BIDIRECTIONAL);
825 struct ibmvscsi_host_data *hostdata = evt_struct->hostdata;
830 dev_info(hostdata->dev, "SRP_LOGIN_REJ reason %u\n",
833 atomic_set(&hostdata->request_limit, -1);
836 dev_err(hostdata->dev, "Invalid login response typecode 0x%02x!\n",
839 atomic_set(&hostdata->request_limit, -1);
843 dev_info(hostdata->dev, "SRP_LOGIN succeeded\n");
844 hostdata->client_migrated = 0;
850 atomic_set(&hostdata->request_limit,
854 scsi_unblock_requests(hostdata->host);
859 * @hostdata: ibmvscsi_host_data of host
863 static int send_srp_login(struct ibmvscsi_host_data *hostdata)
868 struct srp_event_struct *evt_struct = get_event_struct(&hostdata->pool);
880 spin_lock_irqsave(hostdata->host->host_lock, flags);
885 atomic_set(&hostdata->request_limit, 0);
887 rc = ibmvscsi_send_srp_event(evt_struct, hostdata, login_timeout * 2);
888 spin_unlock_irqrestore(hostdata->host->host_lock, flags);
889 dev_info(hostdata->dev, "sent SRP login\n");
901 struct ibmvscsi_host_data *hostdata = evt_struct->hostdata;
904 dev_err(hostdata->dev, "error 0x%X getting capabilities info\n",
907 if (hostdata->caps.migration.common.server_support != SERVER_SUPPORTS_CAP)
908 dev_info(hostdata->dev, "Partition migration not supported\n");
911 if (hostdata->caps.reserve.common.server_support ==
913 dev_info(hostdata->dev, "Client reserve enabled\n");
915 dev_info(hostdata->dev, "Client reserve not supported\n");
919 send_srp_login(hostdata);
925 * @hostdata: ibmvscsi_host_data of host
927 static void send_mad_capabilities(struct ibmvscsi_host_data *hostdata)
932 struct device_node *of_node = hostdata->dev->of_node;
935 evt_struct = get_event_struct(&hostdata->pool);
944 hostdata->caps.flags = CAP_LIST_SUPPORTED;
945 if (hostdata->client_migrated)
946 hostdata->caps.flags |= CLIENT_MIGRATED;
948 strncpy(hostdata->caps.name, dev_name(&hostdata->host->shost_gendev),
949 sizeof(hostdata->caps.name));
950 hostdata->caps.name[sizeof(hostdata->caps.name) - 1] = '\0';
953 location = location ? location : dev_name(hostdata->dev);
954 strncpy(hostdata->caps.loc, location, sizeof(hostdata->caps.loc));
955 hostdata->caps.loc[sizeof(hostdata->caps.loc) - 1] = '\0';
958 req->buffer = hostdata->caps_addr;
960 hostdata->caps.migration.common.cap_type = MIGRATION_CAPABILITIES;
961 hostdata->caps.migration.common.length = sizeof(hostdata->caps.migration);
962 hostdata->caps.migration.common.server_support = SERVER_SUPPORTS_CAP;
963 hostdata->caps.migration.ecl = 1;
966 hostdata->caps.reserve.common.cap_type = RESERVATION_CAPABILITIES;
967 hostdata->caps.reserve.common.length = sizeof(hostdata->caps.reserve);
968 hostdata->caps.reserve.common.server_support = SERVER_SUPPORTS_CAP;
969 hostdata->caps.reserve.type = CLIENT_RESERVE_SCSI_2;
970 req->common.length = sizeof(hostdata->caps);
972 req->common.length = sizeof(hostdata->caps) - sizeof(hostdata->caps.reserve);
974 spin_lock_irqsave(hostdata->host->host_lock, flags);
975 if (ibmvscsi_send_srp_event(evt_struct, hostdata, info_timeout * 2))
976 dev_err(hostdata->dev, "couldn't send CAPABILITIES_REQ!\n");
977 spin_unlock_irqrestore(hostdata->host->host_lock, flags);
989 struct ibmvscsi_host_data *hostdata = evt_struct->hostdata;
993 dev_err(hostdata->dev, "fast_fail not supported in server\n");
995 dev_err(hostdata->dev, "fast_fail request failed\n");
997 dev_err(hostdata->dev, "error 0x%X enabling fast_fail\n", status);
999 send_mad_capabilities(hostdata);
1004 * @hostdata: ibmvscsi_host_data of host
1008 static int enable_fast_fail(struct ibmvscsi_host_data *hostdata)
1016 send_mad_capabilities(hostdata);
1020 evt_struct = get_event_struct(&hostdata->pool);
1030 spin_lock_irqsave(hostdata->host->host_lock, flags);
1031 rc = ibmvscsi_send_srp_event(evt_struct, hostdata, info_timeout * 2);
1032 spin_unlock_irqrestore(hostdata->host->host_lock, flags);
1045 struct ibmvscsi_host_data *hostdata = evt_struct->hostdata;
1048 dev_err(hostdata->dev, "error %d getting adapter info\n",
1051 dev_info(hostdata->dev, "host srp version: %s, "
1053 hostdata->madapter_info.srp_version,
1054 hostdata->madapter_info.partition_name,
1055 hostdata->madapter_info.partition_number,
1056 hostdata->madapter_info.os_type,
1057 hostdata->madapter_info.port_max_txu[0]);
1059 if (hostdata->madapter_info.port_max_txu[0])
1060 hostdata->host->max_sectors =
1061 hostdata->madapter_info.port_max_txu[0] >> 9;
1063 if (hostdata->madapter_info.os_type == 3 &&
1064 strcmp(hostdata->madapter_info.srp_version, "1.6a") <= 0) {
1065 dev_err(hostdata->dev, "host (Ver. %s) doesn't support large transfers\n",
1066 hostdata->madapter_info.srp_version);
1067 dev_err(hostdata->dev, "limiting scatterlists to %d\n",
1069 hostdata->host->sg_tablesize = MAX_INDIRECT_BUFS;
1072 if (hostdata->madapter_info.os_type == 3) {
1073 enable_fast_fail(hostdata);
1078 send_srp_login(hostdata);
1086 * @hostdata: ibmvscsi_host_data of host
1090 static void send_mad_adapter_info(struct ibmvscsi_host_data *hostdata)
1096 evt_struct = get_event_struct(&hostdata->pool);
1108 req->common.length = sizeof(hostdata->madapter_info);
1109 req->buffer = hostdata->adapter_info_addr;
1111 spin_lock_irqsave(hostdata->host->host_lock, flags);
1112 if (ibmvscsi_send_srp_event(evt_struct, hostdata, info_timeout * 2))
1113 dev_err(hostdata->dev, "couldn't send ADAPTER_INFO_REQ!\n");
1114 spin_unlock_irqrestore(hostdata->host->host_lock, flags);
1121 static void init_adapter(struct ibmvscsi_host_data *hostdata)
1123 send_mad_adapter_info(hostdata);
1147 struct ibmvscsi_host_data *hostdata = shost_priv(cmd->device->host);
1160 spin_lock_irqsave(hostdata->host->host_lock, flags);
1164 list_for_each_entry(tmp_evt, &hostdata->sent, list) {
1172 spin_unlock_irqrestore(hostdata->host->host_lock, flags);
1176 evt = get_event_struct(&hostdata->pool);
1178 spin_unlock_irqrestore(hostdata->host->host_lock, flags);
1201 rsp_rc = ibmvscsi_send_srp_event(evt, hostdata, abort_timeout * 2);
1206 spin_unlock_irqrestore(hostdata->host->host_lock, flags);
1208 spin_lock_irqsave(hostdata->host->host_lock, flags);
1211 spin_unlock_irqrestore(hostdata->host->host_lock, flags);
1250 spin_lock_irqsave(hostdata->host->host_lock, flags);
1252 list_for_each_entry(tmp_evt, &hostdata->sent, list) {
1260 spin_unlock_irqrestore(hostdata->host->host_lock, flags);
1272 found_evt->hostdata->dev);
1273 free_event_struct(&found_evt->hostdata->pool, found_evt);
1274 spin_unlock_irqrestore(hostdata->host->host_lock, flags);
1275 atomic_inc(&hostdata->request_limit);
1286 struct ibmvscsi_host_data *hostdata = shost_priv(cmd->device->host);
1296 spin_lock_irqsave(hostdata->host->host_lock, flags);
1299 evt = get_event_struct(&hostdata->pool);
1301 spin_unlock_irqrestore(hostdata->host->host_lock, flags);
1323 rsp_rc = ibmvscsi_send_srp_event(evt, hostdata, reset_timeout * 2);
1328 spin_unlock_irqrestore(hostdata->host->host_lock, flags);
1330 spin_lock_irqsave(hostdata->host->host_lock, flags);
1333 spin_unlock_irqrestore(hostdata->host->host_lock, flags);
1370 spin_lock_irqsave(hostdata->host->host_lock, flags);
1371 list_for_each_entry_safe(tmp_evt, pos, &hostdata->sent, list) {
1377 tmp_evt->hostdata->dev);
1378 free_event_struct(&tmp_evt->hostdata->pool,
1380 atomic_inc(&hostdata->request_limit);
1387 spin_unlock_irqrestore(hostdata->host->host_lock, flags);
1398 struct ibmvscsi_host_data *hostdata = shost_priv(cmd->device->host);
1400 dev_err(hostdata->dev, "Resetting connection due to error recovery\n");
1402 ibmvscsi_reset_host(hostdata);
1406 atomic_read(&hostdata->request_limit) < 2;) {
1411 if (atomic_read(&hostdata->request_limit) <= 0)
1420 * @hostdata: ibmvscsi_host_data of host
1424 struct ibmvscsi_host_data *hostdata)
1434 dev_info(hostdata->dev, "partner initialized\n");
1436 if ((rc = ibmvscsi_ops->send_crq(hostdata,
1439 init_adapter(hostdata);
1441 dev_err(hostdata->dev, "Unable to send init rsp. rc=%ld\n", rc);
1446 dev_info(hostdata->dev, "partner initialization complete\n");
1449 init_adapter(hostdata);
1452 dev_err(hostdata->dev, "unknown crq message type: %d\n", crq->format);
1456 scsi_block_requests(hostdata->host);
1457 atomic_set(&hostdata->request_limit, 0);
1460 dev_info(hostdata->dev, "Re-enabling adapter!\n");
1461 hostdata->client_migrated = 1;
1462 hostdata->reenable_crq = 1;
1463 purge_requests(hostdata, DID_REQUEUE);
1464 wake_up(&hostdata->work_wait_q);
1466 dev_err(hostdata->dev, "Virtual adapter failed rc %d!\n",
1468 ibmvscsi_reset_host(hostdata);
1474 dev_err(hostdata->dev, "got an invalid message type 0x%02x\n",
1483 if (!valid_event_struct(&hostdata->pool, evt_struct)) {
1484 dev_err(hostdata->dev, "returned correlation_token 0x%p is invalid!\n",
1490 dev_err(hostdata->dev, "received duplicate correlation_token 0x%p!\n",
1497 &hostdata->request_limit);
1506 dev_err(hostdata->dev, "returned done() is NULL; not running it!\n");
1512 spin_lock_irqsave(evt_struct->hostdata->host->host_lock, flags);
1514 free_event_struct(&evt_struct->hostdata->pool, evt_struct);
1515 spin_unlock_irqrestore(evt_struct->hostdata->host->host_lock, flags);
1522 static int ibmvscsi_do_host_config(struct ibmvscsi_host_data *hostdata,
1531 evt_struct = get_event_struct(&hostdata->pool);
1533 dev_err(hostdata->dev, "couldn't allocate event for HOST_CONFIG!\n");
1548 host_config->buffer = addr = dma_map_single(hostdata->dev, buffer,
1552 if (dma_mapping_error(hostdata->dev, host_config->buffer)) {
1554 dev_err(hostdata->dev,
1556 free_event_struct(&hostdata->pool, evt_struct);
1561 spin_lock_irqsave(hostdata->host->host_lock, flags);
1562 rc = ibmvscsi_send_srp_event(evt_struct, hostdata, info_timeout * 2);
1563 spin_unlock_irqrestore(hostdata->host->host_lock, flags);
1566 dma_unmap_single(hostdata->dev, addr, length, DMA_BIDIRECTIONAL);
1623 struct ibmvscsi_host_data *hostdata = shost_priv(shost);
1626 len = snprintf(buf, sizeof(hostdata->caps.loc), "%s\n",
1627 hostdata->caps.loc);
1643 struct ibmvscsi_host_data *hostdata = shost_priv(shost);
1646 len = snprintf(buf, sizeof(hostdata->caps.name), "%s\n",
1647 hostdata->caps.name);
1663 struct ibmvscsi_host_data *hostdata = shost_priv(shost);
1667 hostdata->madapter_info.srp_version);
1684 struct ibmvscsi_host_data *hostdata = shost_priv(shost);
1688 hostdata->madapter_info.partition_name);
1705 struct ibmvscsi_host_data *hostdata = shost_priv(shost);
1709 hostdata->madapter_info.partition_number);
1725 struct ibmvscsi_host_data *hostdata = shost_priv(shost);
1729 hostdata->madapter_info.mad_version);
1745 struct ibmvscsi_host_data *hostdata = shost_priv(shost);
1748 len = snprintf(buf, PAGE_SIZE, "%d\n", hostdata->madapter_info.os_type);
1764 struct ibmvscsi_host_data *hostdata = shost_priv(shost);
1767 if (ibmvscsi_do_host_config(hostdata, buf, PAGE_SIZE) == 0)
1834 static void ibmvscsi_do_work(struct ibmvscsi_host_data *hostdata)
1839 if (hostdata->reset_crq) {
1841 hostdata->reset_crq = 0;
1843 rc = ibmvscsi_ops->reset_crq_queue(&hostdata->queue, hostdata);
1845 rc = ibmvscsi_ops->send_crq(hostdata, 0xC001000000000000LL, 0);
1846 vio_enable_interrupts(to_vio_dev(hostdata->dev));
1847 } else if (hostdata->reenable_crq) {
1850 rc = ibmvscsi_ops->reenable_crq_queue(&hostdata->queue, hostdata);
1851 hostdata->reenable_crq = 0;
1853 rc = ibmvscsi_ops->send_crq(hostdata, 0xC001000000000000LL, 0);
1858 atomic_set(&hostdata->request_limit, -1);
1859 dev_err(hostdata->dev, "error after %s\n", action);
1862 scsi_unblock_requests(hostdata->host);
1865 static int ibmvscsi_work_to_do(struct ibmvscsi_host_data *hostdata)
1869 else if (hostdata->reset_crq) {
1872 } else if (hostdata->reenable_crq) {
1882 struct ibmvscsi_host_data *hostdata = data;
1888 rc = wait_event_interruptible(hostdata->work_wait_q,
1889 ibmvscsi_work_to_do(hostdata));
1896 ibmvscsi_do_work(hostdata);
1907 struct ibmvscsi_host_data *hostdata;
1917 host = scsi_host_alloc(&driver_template, sizeof(*hostdata));
1924 hostdata = shost_priv(host);
1925 memset(hostdata, 0x00, sizeof(*hostdata));
1926 INIT_LIST_HEAD(&hostdata->sent);
1927 init_waitqueue_head(&hostdata->work_wait_q);
1928 hostdata->host = host;
1929 hostdata->dev = dev;
1930 atomic_set(&hostdata->request_limit, -1);
1931 hostdata->host->max_sectors = IBMVSCSI_MAX_SECTORS_DEFAULT;
1933 if (map_persist_bufs(hostdata)) {
1938 hostdata->work_thread = kthread_run(ibmvscsi_work, hostdata, "%s_%d",
1941 if (IS_ERR(hostdata->work_thread)) {
1943 PTR_ERR(hostdata->work_thread));
1947 rc = ibmvscsi_ops->init_crq_queue(&hostdata->queue, hostdata, max_events);
1952 if (initialize_event_pool(&hostdata->pool, max_events, hostdata) != 0) {
1962 if (scsi_add_host(hostdata->host, hostdata->dev))
1966 memcpy(ids.port_id, hostdata->madapter_info.partition_name,
1977 if (ibmvscsi_ops->send_crq(hostdata, 0xC001000000000000LL, 0) == 0
1987 atomic_read(&hostdata->request_limit) < 2;) {
1993 if (atomic_read(&hostdata->request_limit) > 0)
1997 dev_set_drvdata(&vdev->dev, hostdata);
2001 scsi_remove_host(hostdata->host);
2003 release_event_pool(&hostdata->pool, hostdata);
2005 ibmvscsi_ops->release_crq_queue(&hostdata->queue, hostdata, max_events);
2007 kthread_stop(hostdata->work_thread);
2009 unmap_persist_bufs(hostdata);
2018 struct ibmvscsi_host_data *hostdata = dev_get_drvdata(&vdev->dev);
2019 unmap_persist_bufs(hostdata);
2020 release_event_pool(&hostdata->pool, hostdata);
2021 ibmvscsi_ops->release_crq_queue(&hostdata->queue, hostdata,
2024 kthread_stop(hostdata->work_thread);
2025 srp_remove_host(hostdata->host);
2026 scsi_remove_host(hostdata->host);
2027 scsi_host_put(hostdata->host);
2041 struct ibmvscsi_host_data *hostdata = dev_get_drvdata(dev);
2042 return ibmvscsi_ops->resume(hostdata);