Lines Matching refs:hostdata
110 struct ibmvscsi_host_data *hostdata);
125 struct ibmvscsi_host_data *hostdata = in ibmvscsi_handle_event() local
127 vio_disable_interrupts(to_vio_dev(hostdata->dev)); in ibmvscsi_handle_event()
128 tasklet_schedule(&hostdata->srp_task); in ibmvscsi_handle_event()
142 struct ibmvscsi_host_data *hostdata, in ibmvscsi_release_crq_queue() argument
146 struct vio_dev *vdev = to_vio_dev(hostdata->dev); in ibmvscsi_release_crq_queue()
147 free_irq(vdev->irq, (void *)hostdata); in ibmvscsi_release_crq_queue()
148 tasklet_kill(&hostdata->srp_task); in ibmvscsi_release_crq_queue()
154 dma_unmap_single(hostdata->dev, in ibmvscsi_release_crq_queue()
195 static int ibmvscsi_send_crq(struct ibmvscsi_host_data *hostdata, in ibmvscsi_send_crq() argument
198 struct vio_dev *vdev = to_vio_dev(hostdata->dev); in ibmvscsi_send_crq()
214 struct ibmvscsi_host_data *hostdata = (struct ibmvscsi_host_data *)data; in ibmvscsi_task() local
215 struct vio_dev *vdev = to_vio_dev(hostdata->dev); in ibmvscsi_task()
221 while ((crq = crq_queue_next_crq(&hostdata->queue)) != NULL) { in ibmvscsi_task()
222 ibmvscsi_handle_crq(crq, hostdata); in ibmvscsi_task()
228 crq = crq_queue_next_crq(&hostdata->queue); in ibmvscsi_task()
231 ibmvscsi_handle_crq(crq, hostdata); in ibmvscsi_task()
261 static void set_adapter_info(struct ibmvscsi_host_data *hostdata) in set_adapter_info() argument
263 memset(&hostdata->madapter_info, 0x00, in set_adapter_info()
264 sizeof(hostdata->madapter_info)); in set_adapter_info()
266 dev_info(hostdata->dev, "SRP_VERSION: %s\n", SRP_VERSION); in set_adapter_info()
267 strcpy(hostdata->madapter_info.srp_version, SRP_VERSION); in set_adapter_info()
269 strscpy(hostdata->madapter_info.partition_name, partition_name, in set_adapter_info()
270 sizeof(hostdata->madapter_info.partition_name)); in set_adapter_info()
272 hostdata->madapter_info.partition_number = in set_adapter_info()
275 hostdata->madapter_info.mad_version = cpu_to_be32(SRP_MAD_VERSION_1); in set_adapter_info()
276 hostdata->madapter_info.os_type = cpu_to_be32(SRP_MAD_OS_LINUX); in set_adapter_info()
285 struct ibmvscsi_host_data *hostdata) in ibmvscsi_reset_crq_queue() argument
288 struct vio_dev *vdev = to_vio_dev(hostdata->dev); in ibmvscsi_reset_crq_queue()
301 set_adapter_info(hostdata); in ibmvscsi_reset_crq_queue()
309 dev_warn(hostdata->dev, "Partner adapter not ready\n"); in ibmvscsi_reset_crq_queue()
311 dev_warn(hostdata->dev, "couldn't register crq--rc 0x%x\n", rc); in ibmvscsi_reset_crq_queue()
327 struct ibmvscsi_host_data *hostdata, in ibmvscsi_init_crq_queue() argument
332 struct vio_dev *vdev = to_vio_dev(hostdata->dev); in ibmvscsi_init_crq_queue()
340 queue->msg_token = dma_map_single(hostdata->dev, queue->msgs, in ibmvscsi_init_crq_queue()
344 if (dma_mapping_error(hostdata->dev, queue->msg_token)) in ibmvscsi_init_crq_queue()
348 set_adapter_info(hostdata); in ibmvscsi_init_crq_queue()
356 hostdata); in ibmvscsi_init_crq_queue()
360 dev_warn(hostdata->dev, "Partner adapter not ready\n"); in ibmvscsi_init_crq_queue()
363 dev_warn(hostdata->dev, "Error %d opening adapter\n", rc); in ibmvscsi_init_crq_queue()
370 tasklet_init(&hostdata->srp_task, (void *)ibmvscsi_task, in ibmvscsi_init_crq_queue()
371 (unsigned long)hostdata); in ibmvscsi_init_crq_queue()
375 0, "ibmvscsi", (void *)hostdata) != 0) { in ibmvscsi_init_crq_queue()
376 dev_err(hostdata->dev, "couldn't register irq 0x%x\n", in ibmvscsi_init_crq_queue()
383 dev_err(hostdata->dev, "Error %d enabling interrupts!!!\n", rc); in ibmvscsi_init_crq_queue()
390 tasklet_kill(&hostdata->srp_task); in ibmvscsi_init_crq_queue()
398 dma_unmap_single(hostdata->dev, in ibmvscsi_init_crq_queue()
413 struct ibmvscsi_host_data *hostdata) in ibmvscsi_reenable_crq_queue() argument
416 struct vio_dev *vdev = to_vio_dev(hostdata->dev); in ibmvscsi_reenable_crq_queue()
418 set_adapter_info(hostdata); in ibmvscsi_reenable_crq_queue()
428 dev_err(hostdata->dev, "Error %d enabling adapter\n", rc); in ibmvscsi_reenable_crq_queue()
444 int size, struct ibmvscsi_host_data *hostdata) in initialize_event_pool() argument
455 dma_alloc_coherent(hostdata->dev, in initialize_event_pool()
472 evt->hostdata = hostdata; in initialize_event_pool()
488 struct ibmvscsi_host_data *hostdata) in release_event_pool() argument
495 dma_free_coherent(hostdata->dev, in release_event_pool()
502 dev_warn(hostdata->dev, "releasing event pool with %d " in release_event_pool()
505 dma_free_coherent(hostdata->dev, in release_event_pool()
537 dev_err(evt->hostdata->dev, "Freeing invalid event_struct %p " in free_event_struct()
542 dev_err(evt->hostdata->dev, "Freeing event_struct %p " in free_event_struct()
783 static void purge_requests(struct ibmvscsi_host_data *hostdata, int error_code) in purge_requests() argument
788 spin_lock_irqsave(hostdata->host->host_lock, flags); in purge_requests()
789 while (!list_empty(&hostdata->sent)) { in purge_requests()
790 evt = list_first_entry(&hostdata->sent, struct srp_event_struct, list); in purge_requests()
794 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in purge_requests()
798 evt->hostdata->dev); in purge_requests()
804 free_event_struct(&evt->hostdata->pool, evt); in purge_requests()
805 spin_lock_irqsave(hostdata->host->host_lock, flags); in purge_requests()
807 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in purge_requests()
817 static void ibmvscsi_set_request_limit(struct ibmvscsi_host_data *hostdata, int limit) in ibmvscsi_set_request_limit() argument
821 spin_lock_irqsave(hostdata->host->host_lock, flags); in ibmvscsi_set_request_limit()
822 atomic_set(&hostdata->request_limit, limit); in ibmvscsi_set_request_limit()
823 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_set_request_limit()
830 static void ibmvscsi_reset_host(struct ibmvscsi_host_data *hostdata) in ibmvscsi_reset_host() argument
832 scsi_block_requests(hostdata->host); in ibmvscsi_reset_host()
833 ibmvscsi_set_request_limit(hostdata, 0); in ibmvscsi_reset_host()
835 purge_requests(hostdata, DID_ERROR); in ibmvscsi_reset_host()
836 hostdata->action = IBMVSCSI_HOST_ACTION_RESET; in ibmvscsi_reset_host()
837 wake_up(&hostdata->work_wait_q); in ibmvscsi_reset_host()
850 struct ibmvscsi_host_data *hostdata = evt_struct->hostdata; in ibmvscsi_timeout() local
852 dev_err(hostdata->dev, "Command timed out (%x). Resetting connection\n", in ibmvscsi_timeout()
855 ibmvscsi_reset_host(hostdata); in ibmvscsi_timeout()
872 struct ibmvscsi_host_data *hostdata, in ibmvscsi_send_srp_event() argument
889 atomic_dec_if_positive(&hostdata->request_limit); in ibmvscsi_send_srp_event()
919 list_for_each_entry(tmp_evt, &hostdata->sent, list) { in ibmvscsi_send_srp_event()
936 list_add_tail(&evt_struct->list, &hostdata->sent); in ibmvscsi_send_srp_event()
944 rc = ibmvscsi_send_crq(hostdata, be64_to_cpu(crq_as_u64[0]), in ibmvscsi_send_srp_event()
956 dev_warn(hostdata->dev, "send warning. " in ibmvscsi_send_srp_event()
960 dev_err(hostdata->dev, "send error %d\n", rc); in ibmvscsi_send_srp_event()
962 atomic_inc(&hostdata->request_limit); in ibmvscsi_send_srp_event()
969 unmap_cmd_data(&evt_struct->iu.srp.cmd, evt_struct, hostdata->dev); in ibmvscsi_send_srp_event()
971 free_event_struct(&hostdata->pool, evt_struct); in ibmvscsi_send_srp_event()
973 atomic_inc(&hostdata->request_limit); in ibmvscsi_send_srp_event()
977 unmap_cmd_data(&evt_struct->iu.srp.cmd, evt_struct, hostdata->dev); in ibmvscsi_send_srp_event()
985 free_event_struct(&hostdata->pool, evt_struct); in ibmvscsi_send_srp_event()
1003 dev_warn(evt_struct->hostdata->dev, in handle_cmd_rsp()
1015 evt_struct->hostdata->dev); in handle_cmd_rsp()
1049 struct ibmvscsi_host_data *hostdata = shost_priv(cmnd->device->host); in ibmvscsi_queuecommand_lck() local
1054 evt_struct = get_event_struct(&hostdata->pool); in ibmvscsi_queuecommand_lck()
1066 if (!map_data_for_srp_cmd(cmnd, evt_struct, srp_cmd, hostdata->dev)) { in ibmvscsi_queuecommand_lck()
1070 free_event_struct(&hostdata->pool, evt_struct); in ibmvscsi_queuecommand_lck()
1095 return ibmvscsi_send_srp_event(evt_struct, hostdata, 0); in ibmvscsi_queuecommand_lck()
1111 static int map_persist_bufs(struct ibmvscsi_host_data *hostdata) in DEF_SCSI_QCMD()
1114 hostdata->caps_addr = dma_map_single(hostdata->dev, &hostdata->caps, in DEF_SCSI_QCMD()
1115 sizeof(hostdata->caps), DMA_BIDIRECTIONAL); in DEF_SCSI_QCMD()
1117 if (dma_mapping_error(hostdata->dev, hostdata->caps_addr)) { in DEF_SCSI_QCMD()
1118 dev_err(hostdata->dev, "Unable to map capabilities buffer!\n"); in DEF_SCSI_QCMD()
1122 hostdata->adapter_info_addr = dma_map_single(hostdata->dev, in DEF_SCSI_QCMD()
1123 &hostdata->madapter_info, in DEF_SCSI_QCMD()
1124 sizeof(hostdata->madapter_info), in DEF_SCSI_QCMD()
1126 if (dma_mapping_error(hostdata->dev, hostdata->adapter_info_addr)) { in DEF_SCSI_QCMD()
1127 dev_err(hostdata->dev, "Unable to map adapter info buffer!\n"); in DEF_SCSI_QCMD()
1128 dma_unmap_single(hostdata->dev, hostdata->caps_addr, in DEF_SCSI_QCMD()
1129 sizeof(hostdata->caps), DMA_BIDIRECTIONAL); in DEF_SCSI_QCMD()
1142 static void unmap_persist_bufs(struct ibmvscsi_host_data *hostdata) in unmap_persist_bufs() argument
1144 dma_unmap_single(hostdata->dev, hostdata->caps_addr, in unmap_persist_bufs()
1145 sizeof(hostdata->caps), DMA_BIDIRECTIONAL); in unmap_persist_bufs()
1147 dma_unmap_single(hostdata->dev, hostdata->adapter_info_addr, in unmap_persist_bufs()
1148 sizeof(hostdata->madapter_info), DMA_BIDIRECTIONAL); in unmap_persist_bufs()
1160 struct ibmvscsi_host_data *hostdata = evt_struct->hostdata; in login_rsp() local
1165 dev_info(hostdata->dev, "SRP_LOGIN_REJ reason %u\n", in login_rsp()
1168 ibmvscsi_set_request_limit(hostdata, -1); in login_rsp()
1171 dev_err(hostdata->dev, "Invalid login response typecode 0x%02x!\n", in login_rsp()
1174 ibmvscsi_set_request_limit(hostdata, -1); in login_rsp()
1178 dev_info(hostdata->dev, "SRP_LOGIN succeeded\n"); in login_rsp()
1179 hostdata->client_migrated = 0; in login_rsp()
1185 ibmvscsi_set_request_limit(hostdata, in login_rsp()
1189 hostdata->action = IBMVSCSI_HOST_ACTION_UNBLOCK; in login_rsp()
1190 wake_up(&hostdata->work_wait_q); in login_rsp()
1199 static int send_srp_login(struct ibmvscsi_host_data *hostdata) in send_srp_login() argument
1204 struct srp_event_struct *evt_struct = get_event_struct(&hostdata->pool); in send_srp_login()
1221 ibmvscsi_set_request_limit(hostdata, 0); in send_srp_login()
1223 spin_lock_irqsave(hostdata->host->host_lock, flags); in send_srp_login()
1224 rc = ibmvscsi_send_srp_event(evt_struct, hostdata, login_timeout * 2); in send_srp_login()
1225 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in send_srp_login()
1226 dev_info(hostdata->dev, "sent SRP login\n"); in send_srp_login()
1238 struct ibmvscsi_host_data *hostdata = evt_struct->hostdata; in capabilities_rsp() local
1241 dev_err(hostdata->dev, "error 0x%X getting capabilities info\n", in capabilities_rsp()
1244 if (hostdata->caps.migration.common.server_support != in capabilities_rsp()
1246 dev_info(hostdata->dev, "Partition migration not supported\n"); in capabilities_rsp()
1249 if (hostdata->caps.reserve.common.server_support == in capabilities_rsp()
1251 dev_info(hostdata->dev, "Client reserve enabled\n"); in capabilities_rsp()
1253 dev_info(hostdata->dev, "Client reserve not supported\n"); in capabilities_rsp()
1257 send_srp_login(hostdata); in capabilities_rsp()
1265 static void send_mad_capabilities(struct ibmvscsi_host_data *hostdata) in send_mad_capabilities() argument
1270 struct device_node *of_node = hostdata->dev->of_node; in send_mad_capabilities()
1273 evt_struct = get_event_struct(&hostdata->pool); in send_mad_capabilities()
1282 hostdata->caps.flags = cpu_to_be32(CAP_LIST_SUPPORTED); in send_mad_capabilities()
1283 if (hostdata->client_migrated) in send_mad_capabilities()
1284 hostdata->caps.flags |= cpu_to_be32(CLIENT_MIGRATED); in send_mad_capabilities()
1286 strscpy(hostdata->caps.name, dev_name(&hostdata->host->shost_gendev), in send_mad_capabilities()
1287 sizeof(hostdata->caps.name)); in send_mad_capabilities()
1290 location = location ? location : dev_name(hostdata->dev); in send_mad_capabilities()
1291 strscpy(hostdata->caps.loc, location, sizeof(hostdata->caps.loc)); in send_mad_capabilities()
1294 req->buffer = cpu_to_be64(hostdata->caps_addr); in send_mad_capabilities()
1296 hostdata->caps.migration.common.cap_type = in send_mad_capabilities()
1298 hostdata->caps.migration.common.length = in send_mad_capabilities()
1299 cpu_to_be16(sizeof(hostdata->caps.migration)); in send_mad_capabilities()
1300 hostdata->caps.migration.common.server_support = in send_mad_capabilities()
1302 hostdata->caps.migration.ecl = cpu_to_be32(1); in send_mad_capabilities()
1305 hostdata->caps.reserve.common.cap_type = in send_mad_capabilities()
1307 hostdata->caps.reserve.common.length = in send_mad_capabilities()
1308 cpu_to_be16(sizeof(hostdata->caps.reserve)); in send_mad_capabilities()
1309 hostdata->caps.reserve.common.server_support = in send_mad_capabilities()
1311 hostdata->caps.reserve.type = in send_mad_capabilities()
1314 cpu_to_be16(sizeof(hostdata->caps)); in send_mad_capabilities()
1316 req->common.length = cpu_to_be16(sizeof(hostdata->caps) - in send_mad_capabilities()
1317 sizeof(hostdata->caps.reserve)); in send_mad_capabilities()
1319 spin_lock_irqsave(hostdata->host->host_lock, flags); in send_mad_capabilities()
1320 if (ibmvscsi_send_srp_event(evt_struct, hostdata, info_timeout * 2)) in send_mad_capabilities()
1321 dev_err(hostdata->dev, "couldn't send CAPABILITIES_REQ!\n"); in send_mad_capabilities()
1322 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in send_mad_capabilities()
1334 struct ibmvscsi_host_data *hostdata = evt_struct->hostdata; in fast_fail_rsp() local
1338 dev_err(hostdata->dev, "fast_fail not supported in server\n"); in fast_fail_rsp()
1340 dev_err(hostdata->dev, "fast_fail request failed\n"); in fast_fail_rsp()
1342 dev_err(hostdata->dev, "error 0x%X enabling fast_fail\n", status); in fast_fail_rsp()
1344 send_mad_capabilities(hostdata); in fast_fail_rsp()
1353 static int enable_fast_fail(struct ibmvscsi_host_data *hostdata) in enable_fast_fail() argument
1361 send_mad_capabilities(hostdata); in enable_fast_fail()
1365 evt_struct = get_event_struct(&hostdata->pool); in enable_fast_fail()
1375 spin_lock_irqsave(hostdata->host->host_lock, flags); in enable_fast_fail()
1376 rc = ibmvscsi_send_srp_event(evt_struct, hostdata, info_timeout * 2); in enable_fast_fail()
1377 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in enable_fast_fail()
1390 struct ibmvscsi_host_data *hostdata = evt_struct->hostdata; in adapter_info_rsp() local
1393 dev_err(hostdata->dev, "error %d getting adapter info\n", in adapter_info_rsp()
1396 dev_info(hostdata->dev, "host srp version: %s, " in adapter_info_rsp()
1398 hostdata->madapter_info.srp_version, in adapter_info_rsp()
1399 hostdata->madapter_info.partition_name, in adapter_info_rsp()
1400 be32_to_cpu(hostdata->madapter_info.partition_number), in adapter_info_rsp()
1401 be32_to_cpu(hostdata->madapter_info.os_type), in adapter_info_rsp()
1402 be32_to_cpu(hostdata->madapter_info.port_max_txu[0])); in adapter_info_rsp()
1404 if (hostdata->madapter_info.port_max_txu[0]) in adapter_info_rsp()
1405 hostdata->host->max_sectors = in adapter_info_rsp()
1406 be32_to_cpu(hostdata->madapter_info.port_max_txu[0]) >> 9; in adapter_info_rsp()
1408 if (be32_to_cpu(hostdata->madapter_info.os_type) == SRP_MAD_OS_AIX && in adapter_info_rsp()
1409 strcmp(hostdata->madapter_info.srp_version, "1.6a") <= 0) { in adapter_info_rsp()
1410 dev_err(hostdata->dev, "host (Ver. %s) doesn't support large transfers\n", in adapter_info_rsp()
1411 hostdata->madapter_info.srp_version); in adapter_info_rsp()
1412 dev_err(hostdata->dev, "limiting scatterlists to %d\n", in adapter_info_rsp()
1414 hostdata->host->sg_tablesize = MAX_INDIRECT_BUFS; in adapter_info_rsp()
1417 if (be32_to_cpu(hostdata->madapter_info.os_type) == SRP_MAD_OS_AIX) { in adapter_info_rsp()
1418 enable_fast_fail(hostdata); in adapter_info_rsp()
1423 send_srp_login(hostdata); in adapter_info_rsp()
1435 static void send_mad_adapter_info(struct ibmvscsi_host_data *hostdata) in send_mad_adapter_info() argument
1441 evt_struct = get_event_struct(&hostdata->pool); in send_mad_adapter_info()
1453 req->common.length = cpu_to_be16(sizeof(hostdata->madapter_info)); in send_mad_adapter_info()
1454 req->buffer = cpu_to_be64(hostdata->adapter_info_addr); in send_mad_adapter_info()
1456 spin_lock_irqsave(hostdata->host->host_lock, flags); in send_mad_adapter_info()
1457 if (ibmvscsi_send_srp_event(evt_struct, hostdata, info_timeout * 2)) in send_mad_adapter_info()
1458 dev_err(hostdata->dev, "couldn't send ADAPTER_INFO_REQ!\n"); in send_mad_adapter_info()
1459 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in send_mad_adapter_info()
1465 static void init_adapter(struct ibmvscsi_host_data *hostdata) in init_adapter() argument
1467 send_mad_adapter_info(hostdata); in init_adapter()
1491 struct ibmvscsi_host_data *hostdata = shost_priv(cmd->device->host); in ibmvscsi_eh_abort_handler() local
1504 spin_lock_irqsave(hostdata->host->host_lock, flags); in ibmvscsi_eh_abort_handler()
1508 list_for_each_entry(tmp_evt, &hostdata->sent, list) { in ibmvscsi_eh_abort_handler()
1516 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_eh_abort_handler()
1520 evt = get_event_struct(&hostdata->pool); in ibmvscsi_eh_abort_handler()
1522 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_eh_abort_handler()
1545 rsp_rc = ibmvscsi_send_srp_event(evt, hostdata, abort_timeout * 2); in ibmvscsi_eh_abort_handler()
1550 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_eh_abort_handler()
1552 spin_lock_irqsave(hostdata->host->host_lock, flags); in ibmvscsi_eh_abort_handler()
1555 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_eh_abort_handler()
1594 spin_lock_irqsave(hostdata->host->host_lock, flags); in ibmvscsi_eh_abort_handler()
1596 list_for_each_entry(tmp_evt, &hostdata->sent, list) { in ibmvscsi_eh_abort_handler()
1604 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_eh_abort_handler()
1616 found_evt->hostdata->dev); in ibmvscsi_eh_abort_handler()
1617 free_event_struct(&found_evt->hostdata->pool, found_evt); in ibmvscsi_eh_abort_handler()
1618 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_eh_abort_handler()
1619 atomic_inc(&hostdata->request_limit); in ibmvscsi_eh_abort_handler()
1630 struct ibmvscsi_host_data *hostdata = shost_priv(cmd->device->host); in ibmvscsi_eh_device_reset_handler() local
1640 spin_lock_irqsave(hostdata->host->host_lock, flags); in ibmvscsi_eh_device_reset_handler()
1643 evt = get_event_struct(&hostdata->pool); in ibmvscsi_eh_device_reset_handler()
1645 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_eh_device_reset_handler()
1667 rsp_rc = ibmvscsi_send_srp_event(evt, hostdata, reset_timeout * 2); in ibmvscsi_eh_device_reset_handler()
1672 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_eh_device_reset_handler()
1674 spin_lock_irqsave(hostdata->host->host_lock, flags); in ibmvscsi_eh_device_reset_handler()
1677 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_eh_device_reset_handler()
1714 spin_lock_irqsave(hostdata->host->host_lock, flags); in ibmvscsi_eh_device_reset_handler()
1715 list_for_each_entry_safe(tmp_evt, pos, &hostdata->sent, list) { in ibmvscsi_eh_device_reset_handler()
1721 tmp_evt->hostdata->dev); in ibmvscsi_eh_device_reset_handler()
1722 free_event_struct(&tmp_evt->hostdata->pool, in ibmvscsi_eh_device_reset_handler()
1724 atomic_inc(&hostdata->request_limit); in ibmvscsi_eh_device_reset_handler()
1731 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_eh_device_reset_handler()
1742 struct ibmvscsi_host_data *hostdata = shost_priv(cmd->device->host); in ibmvscsi_eh_host_reset_handler() local
1744 dev_err(hostdata->dev, "Resetting connection due to error recovery\n"); in ibmvscsi_eh_host_reset_handler()
1746 ibmvscsi_reset_host(hostdata); in ibmvscsi_eh_host_reset_handler()
1750 atomic_read(&hostdata->request_limit) < 2;) { in ibmvscsi_eh_host_reset_handler()
1755 if (atomic_read(&hostdata->request_limit) <= 0) in ibmvscsi_eh_host_reset_handler()
1768 struct ibmvscsi_host_data *hostdata) in ibmvscsi_handle_crq() argument
1779 dev_info(hostdata->dev, "partner initialized\n"); in ibmvscsi_handle_crq()
1781 rc = ibmvscsi_send_crq(hostdata, 0xC002000000000000LL, 0); in ibmvscsi_handle_crq()
1784 init_adapter(hostdata); in ibmvscsi_handle_crq()
1786 dev_err(hostdata->dev, "Unable to send init rsp. rc=%ld\n", rc); in ibmvscsi_handle_crq()
1791 dev_info(hostdata->dev, "partner initialization complete\n"); in ibmvscsi_handle_crq()
1794 init_adapter(hostdata); in ibmvscsi_handle_crq()
1797 dev_err(hostdata->dev, "unknown crq message type: %d\n", crq->format); in ibmvscsi_handle_crq()
1801 scsi_block_requests(hostdata->host); in ibmvscsi_handle_crq()
1802 ibmvscsi_set_request_limit(hostdata, 0); in ibmvscsi_handle_crq()
1805 dev_info(hostdata->dev, "Re-enabling adapter!\n"); in ibmvscsi_handle_crq()
1806 hostdata->client_migrated = 1; in ibmvscsi_handle_crq()
1807 hostdata->action = IBMVSCSI_HOST_ACTION_REENABLE; in ibmvscsi_handle_crq()
1808 purge_requests(hostdata, DID_REQUEUE); in ibmvscsi_handle_crq()
1809 wake_up(&hostdata->work_wait_q); in ibmvscsi_handle_crq()
1811 dev_err(hostdata->dev, "Virtual adapter failed rc %d!\n", in ibmvscsi_handle_crq()
1813 ibmvscsi_reset_host(hostdata); in ibmvscsi_handle_crq()
1819 dev_err(hostdata->dev, "got an invalid message type 0x%02x\n", in ibmvscsi_handle_crq()
1828 if (!valid_event_struct(&hostdata->pool, evt_struct)) { in ibmvscsi_handle_crq()
1829 dev_err(hostdata->dev, "returned correlation_token 0x%p is invalid!\n", in ibmvscsi_handle_crq()
1835 dev_err(hostdata->dev, "received duplicate correlation_token 0x%p!\n", in ibmvscsi_handle_crq()
1842 &hostdata->request_limit); in ibmvscsi_handle_crq()
1851 dev_err(hostdata->dev, "returned done() is NULL; not running it!\n"); in ibmvscsi_handle_crq()
1857 spin_lock_irqsave(evt_struct->hostdata->host->host_lock, flags); in ibmvscsi_handle_crq()
1859 free_event_struct(&evt_struct->hostdata->pool, evt_struct); in ibmvscsi_handle_crq()
1860 spin_unlock_irqrestore(evt_struct->hostdata->host->host_lock, flags); in ibmvscsi_handle_crq()
1909 struct ibmvscsi_host_data *hostdata = shost_priv(shost); in show_host_vhost_loc() local
1912 len = snprintf(buf, sizeof(hostdata->caps.loc), "%s\n", in show_host_vhost_loc()
1913 hostdata->caps.loc); in show_host_vhost_loc()
1929 struct ibmvscsi_host_data *hostdata = shost_priv(shost); in show_host_vhost_name() local
1932 len = snprintf(buf, sizeof(hostdata->caps.name), "%s\n", in show_host_vhost_name()
1933 hostdata->caps.name); in show_host_vhost_name()
1949 struct ibmvscsi_host_data *hostdata = shost_priv(shost); in show_host_srp_version() local
1953 hostdata->madapter_info.srp_version); in show_host_srp_version()
1970 struct ibmvscsi_host_data *hostdata = shost_priv(shost); in show_host_partition_name() local
1974 hostdata->madapter_info.partition_name); in show_host_partition_name()
1991 struct ibmvscsi_host_data *hostdata = shost_priv(shost); in show_host_partition_number() local
1995 be32_to_cpu(hostdata->madapter_info.partition_number)); in show_host_partition_number()
2011 struct ibmvscsi_host_data *hostdata = shost_priv(shost); in show_host_mad_version() local
2015 be32_to_cpu(hostdata->madapter_info.mad_version)); in show_host_mad_version()
2031 struct ibmvscsi_host_data *hostdata = shost_priv(shost); in show_host_os_type() local
2035 be32_to_cpu(hostdata->madapter_info.os_type)); in show_host_os_type()
2063 struct ibmvscsi_host_data *hostdata = shost_priv(shost); in ibmvscsi_host_reset() local
2065 dev_info(hostdata->dev, "Initiating adapter reset!\n"); in ibmvscsi_host_reset()
2066 ibmvscsi_reset_host(hostdata); in ibmvscsi_host_reset()
2127 static void ibmvscsi_do_work(struct ibmvscsi_host_data *hostdata) in ibmvscsi_do_work() argument
2133 spin_lock_irqsave(hostdata->host->host_lock, flags); in ibmvscsi_do_work()
2134 switch (hostdata->action) { in ibmvscsi_do_work()
2139 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_do_work()
2140 rc = ibmvscsi_reset_crq_queue(&hostdata->queue, hostdata); in ibmvscsi_do_work()
2141 spin_lock_irqsave(hostdata->host->host_lock, flags); in ibmvscsi_do_work()
2143 rc = ibmvscsi_send_crq(hostdata, 0xC001000000000000LL, 0); in ibmvscsi_do_work()
2144 vio_enable_interrupts(to_vio_dev(hostdata->dev)); in ibmvscsi_do_work()
2148 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_do_work()
2149 rc = ibmvscsi_reenable_crq_queue(&hostdata->queue, hostdata); in ibmvscsi_do_work()
2150 spin_lock_irqsave(hostdata->host->host_lock, flags); in ibmvscsi_do_work()
2152 rc = ibmvscsi_send_crq(hostdata, 0xC001000000000000LL, 0); in ibmvscsi_do_work()
2156 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_do_work()
2160 hostdata->action = IBMVSCSI_HOST_ACTION_NONE; in ibmvscsi_do_work()
2161 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_do_work()
2164 ibmvscsi_set_request_limit(hostdata, -1); in ibmvscsi_do_work()
2165 dev_err(hostdata->dev, "error after %s\n", action); in ibmvscsi_do_work()
2168 scsi_unblock_requests(hostdata->host); in ibmvscsi_do_work()
2171 static int __ibmvscsi_work_to_do(struct ibmvscsi_host_data *hostdata) in __ibmvscsi_work_to_do() argument
2175 switch (hostdata->action) { in __ibmvscsi_work_to_do()
2188 static int ibmvscsi_work_to_do(struct ibmvscsi_host_data *hostdata) in ibmvscsi_work_to_do() argument
2193 spin_lock_irqsave(hostdata->host->host_lock, flags); in ibmvscsi_work_to_do()
2194 rc = __ibmvscsi_work_to_do(hostdata); in ibmvscsi_work_to_do()
2195 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_work_to_do()
2202 struct ibmvscsi_host_data *hostdata = data; in ibmvscsi_work() local
2208 rc = wait_event_interruptible(hostdata->work_wait_q, in ibmvscsi_work()
2209 ibmvscsi_work_to_do(hostdata)); in ibmvscsi_work()
2216 ibmvscsi_do_work(hostdata); in ibmvscsi_work()
2227 struct ibmvscsi_host_data *hostdata; in ibmvscsi_probe() local
2237 host = scsi_host_alloc(&driver_template, sizeof(*hostdata)); in ibmvscsi_probe()
2244 hostdata = shost_priv(host); in ibmvscsi_probe()
2245 memset(hostdata, 0x00, sizeof(*hostdata)); in ibmvscsi_probe()
2246 INIT_LIST_HEAD(&hostdata->sent); in ibmvscsi_probe()
2247 init_waitqueue_head(&hostdata->work_wait_q); in ibmvscsi_probe()
2248 hostdata->host = host; in ibmvscsi_probe()
2249 hostdata->dev = dev; in ibmvscsi_probe()
2250 ibmvscsi_set_request_limit(hostdata, -1); in ibmvscsi_probe()
2251 hostdata->host->max_sectors = IBMVSCSI_MAX_SECTORS_DEFAULT; in ibmvscsi_probe()
2253 if (map_persist_bufs(hostdata)) { in ibmvscsi_probe()
2258 hostdata->work_thread = kthread_run(ibmvscsi_work, hostdata, "%s_%d", in ibmvscsi_probe()
2261 if (IS_ERR(hostdata->work_thread)) { in ibmvscsi_probe()
2263 PTR_ERR(hostdata->work_thread)); in ibmvscsi_probe()
2267 rc = ibmvscsi_init_crq_queue(&hostdata->queue, hostdata, max_events); in ibmvscsi_probe()
2272 if (initialize_event_pool(&hostdata->pool, max_events, hostdata) != 0) { in ibmvscsi_probe()
2286 if (scsi_add_host(hostdata->host, hostdata->dev)) in ibmvscsi_probe()
2290 memcpy(ids.port_id, hostdata->madapter_info.partition_name, in ibmvscsi_probe()
2301 if (ibmvscsi_send_crq(hostdata, 0xC001000000000000LL, 0) == 0 in ibmvscsi_probe()
2311 atomic_read(&hostdata->request_limit) < 2;) { in ibmvscsi_probe()
2317 if (atomic_read(&hostdata->request_limit) > 0) in ibmvscsi_probe()
2321 dev_set_drvdata(&vdev->dev, hostdata); in ibmvscsi_probe()
2323 list_add_tail(&hostdata->host_list, &ibmvscsi_head); in ibmvscsi_probe()
2328 scsi_remove_host(hostdata->host); in ibmvscsi_probe()
2330 release_event_pool(&hostdata->pool, hostdata); in ibmvscsi_probe()
2332 ibmvscsi_release_crq_queue(&hostdata->queue, hostdata, max_events); in ibmvscsi_probe()
2334 kthread_stop(hostdata->work_thread); in ibmvscsi_probe()
2336 unmap_persist_bufs(hostdata); in ibmvscsi_probe()
2345 struct ibmvscsi_host_data *hostdata = dev_get_drvdata(&vdev->dev); in ibmvscsi_remove() local
2347 srp_remove_host(hostdata->host); in ibmvscsi_remove()
2348 scsi_remove_host(hostdata->host); in ibmvscsi_remove()
2350 purge_requests(hostdata, DID_ERROR); in ibmvscsi_remove()
2351 release_event_pool(&hostdata->pool, hostdata); in ibmvscsi_remove()
2353 ibmvscsi_release_crq_queue(&hostdata->queue, hostdata, in ibmvscsi_remove()
2356 kthread_stop(hostdata->work_thread); in ibmvscsi_remove()
2357 unmap_persist_bufs(hostdata); in ibmvscsi_remove()
2360 list_del(&hostdata->host_list); in ibmvscsi_remove()
2363 scsi_host_put(hostdata->host); in ibmvscsi_remove()
2375 struct ibmvscsi_host_data *hostdata = dev_get_drvdata(dev); in ibmvscsi_resume() local
2376 vio_disable_interrupts(to_vio_dev(hostdata->dev)); in ibmvscsi_resume()
2377 tasklet_schedule(&hostdata->srp_task); in ibmvscsi_resume()