Lines Matching refs:hostdata

122 				struct ibmvscsi_host_data *hostdata);
137 struct ibmvscsi_host_data *hostdata = in ibmvscsi_handle_event() local
139 vio_disable_interrupts(to_vio_dev(hostdata->dev)); in ibmvscsi_handle_event()
140 tasklet_schedule(&hostdata->srp_task); in ibmvscsi_handle_event()
153 struct ibmvscsi_host_data *hostdata, in ibmvscsi_release_crq_queue() argument
157 struct vio_dev *vdev = to_vio_dev(hostdata->dev); in ibmvscsi_release_crq_queue()
158 free_irq(vdev->irq, (void *)hostdata); in ibmvscsi_release_crq_queue()
159 tasklet_kill(&hostdata->srp_task); in ibmvscsi_release_crq_queue()
165 dma_unmap_single(hostdata->dev, in ibmvscsi_release_crq_queue()
206 static int ibmvscsi_send_crq(struct ibmvscsi_host_data *hostdata, in ibmvscsi_send_crq() argument
209 struct vio_dev *vdev = to_vio_dev(hostdata->dev); in ibmvscsi_send_crq()
225 struct ibmvscsi_host_data *hostdata = (struct ibmvscsi_host_data *)data; in ibmvscsi_task() local
226 struct vio_dev *vdev = to_vio_dev(hostdata->dev); in ibmvscsi_task()
232 while ((crq = crq_queue_next_crq(&hostdata->queue)) != NULL) { in ibmvscsi_task()
233 ibmvscsi_handle_crq(crq, hostdata); in ibmvscsi_task()
238 crq = crq_queue_next_crq(&hostdata->queue); in ibmvscsi_task()
241 ibmvscsi_handle_crq(crq, hostdata); in ibmvscsi_task()
272 static void set_adapter_info(struct ibmvscsi_host_data *hostdata) in set_adapter_info() argument
274 memset(&hostdata->madapter_info, 0x00, in set_adapter_info()
275 sizeof(hostdata->madapter_info)); in set_adapter_info()
277 dev_info(hostdata->dev, "SRP_VERSION: %s\n", SRP_VERSION); in set_adapter_info()
278 strcpy(hostdata->madapter_info.srp_version, SRP_VERSION); in set_adapter_info()
280 strncpy(hostdata->madapter_info.partition_name, partition_name, in set_adapter_info()
281 sizeof(hostdata->madapter_info.partition_name)); in set_adapter_info()
283 hostdata->madapter_info.partition_number = in set_adapter_info()
286 hostdata->madapter_info.mad_version = cpu_to_be32(1); in set_adapter_info()
287 hostdata->madapter_info.os_type = cpu_to_be32(2); in set_adapter_info()
297 struct ibmvscsi_host_data *hostdata) in ibmvscsi_reset_crq_queue() argument
300 struct vio_dev *vdev = to_vio_dev(hostdata->dev); in ibmvscsi_reset_crq_queue()
313 set_adapter_info(hostdata); in ibmvscsi_reset_crq_queue()
321 dev_warn(hostdata->dev, "Partner adapter not ready\n"); in ibmvscsi_reset_crq_queue()
323 dev_warn(hostdata->dev, "couldn't register crq--rc 0x%x\n", rc); in ibmvscsi_reset_crq_queue()
338 struct ibmvscsi_host_data *hostdata, in ibmvscsi_init_crq_queue() argument
343 struct vio_dev *vdev = to_vio_dev(hostdata->dev); in ibmvscsi_init_crq_queue()
351 queue->msg_token = dma_map_single(hostdata->dev, queue->msgs, in ibmvscsi_init_crq_queue()
355 if (dma_mapping_error(hostdata->dev, queue->msg_token)) in ibmvscsi_init_crq_queue()
359 set_adapter_info(hostdata); in ibmvscsi_init_crq_queue()
367 hostdata); in ibmvscsi_init_crq_queue()
371 dev_warn(hostdata->dev, "Partner adapter not ready\n"); in ibmvscsi_init_crq_queue()
374 dev_warn(hostdata->dev, "Error %d opening adapter\n", rc); in ibmvscsi_init_crq_queue()
381 tasklet_init(&hostdata->srp_task, (void *)ibmvscsi_task, in ibmvscsi_init_crq_queue()
382 (unsigned long)hostdata); in ibmvscsi_init_crq_queue()
386 0, "ibmvscsi", (void *)hostdata) != 0) { in ibmvscsi_init_crq_queue()
387 dev_err(hostdata->dev, "couldn't register irq 0x%x\n", in ibmvscsi_init_crq_queue()
394 dev_err(hostdata->dev, "Error %d enabling interrupts!!!\n", rc); in ibmvscsi_init_crq_queue()
401 tasklet_kill(&hostdata->srp_task); in ibmvscsi_init_crq_queue()
409 dma_unmap_single(hostdata->dev, in ibmvscsi_init_crq_queue()
425 struct ibmvscsi_host_data *hostdata) in ibmvscsi_reenable_crq_queue() argument
428 struct vio_dev *vdev = to_vio_dev(hostdata->dev); in ibmvscsi_reenable_crq_queue()
438 dev_err(hostdata->dev, "Error %d enabling adapter\n", rc); in ibmvscsi_reenable_crq_queue()
454 int size, struct ibmvscsi_host_data *hostdata) in initialize_event_pool() argument
465 dma_alloc_coherent(hostdata->dev, in initialize_event_pool()
482 evt->hostdata = hostdata; in initialize_event_pool()
498 struct ibmvscsi_host_data *hostdata) in release_event_pool() argument
505 dma_free_coherent(hostdata->dev, in release_event_pool()
512 dev_warn(hostdata->dev, "releasing event pool with %d " in release_event_pool()
515 dma_free_coherent(hostdata->dev, in release_event_pool()
548 dev_err(evt->hostdata->dev, "Freeing invalid event_struct %p " in free_event_struct()
553 dev_err(evt->hostdata->dev, "Freeing event_struct %p " in free_event_struct()
792 static void purge_requests(struct ibmvscsi_host_data *hostdata, int error_code) in purge_requests() argument
797 spin_lock_irqsave(hostdata->host->host_lock, flags); in purge_requests()
798 while (!list_empty(&hostdata->sent)) { in purge_requests()
799 evt = list_first_entry(&hostdata->sent, struct srp_event_struct, list); in purge_requests()
803 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in purge_requests()
807 evt->hostdata->dev); in purge_requests()
813 free_event_struct(&evt->hostdata->pool, evt); in purge_requests()
814 spin_lock_irqsave(hostdata->host->host_lock, flags); in purge_requests()
816 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in purge_requests()
823 static void ibmvscsi_reset_host(struct ibmvscsi_host_data *hostdata) in ibmvscsi_reset_host() argument
825 scsi_block_requests(hostdata->host); in ibmvscsi_reset_host()
826 atomic_set(&hostdata->request_limit, 0); in ibmvscsi_reset_host()
828 purge_requests(hostdata, DID_ERROR); in ibmvscsi_reset_host()
829 hostdata->reset_crq = 1; in ibmvscsi_reset_host()
830 wake_up(&hostdata->work_wait_q); in ibmvscsi_reset_host()
841 struct ibmvscsi_host_data *hostdata = evt_struct->hostdata; in ibmvscsi_timeout() local
843 dev_err(hostdata->dev, "Command timed out (%x). Resetting connection\n", in ibmvscsi_timeout()
846 ibmvscsi_reset_host(hostdata); in ibmvscsi_timeout()
863 struct ibmvscsi_host_data *hostdata, in ibmvscsi_send_srp_event() argument
880 atomic_dec_if_positive(&hostdata->request_limit); in ibmvscsi_send_srp_event()
910 list_for_each_entry(tmp_evt, &hostdata->sent, list) { in ibmvscsi_send_srp_event()
927 list_add_tail(&evt_struct->list, &hostdata->sent); in ibmvscsi_send_srp_event()
937 rc = ibmvscsi_send_crq(hostdata, be64_to_cpu(crq_as_u64[0]), in ibmvscsi_send_srp_event()
949 dev_warn(hostdata->dev, "send warning. " in ibmvscsi_send_srp_event()
953 dev_err(hostdata->dev, "send error %d\n", rc); in ibmvscsi_send_srp_event()
955 atomic_inc(&hostdata->request_limit); in ibmvscsi_send_srp_event()
962 unmap_cmd_data(&evt_struct->iu.srp.cmd, evt_struct, hostdata->dev); in ibmvscsi_send_srp_event()
964 free_event_struct(&hostdata->pool, evt_struct); in ibmvscsi_send_srp_event()
966 atomic_inc(&hostdata->request_limit); in ibmvscsi_send_srp_event()
970 unmap_cmd_data(&evt_struct->iu.srp.cmd, evt_struct, hostdata->dev); in ibmvscsi_send_srp_event()
978 free_event_struct(&hostdata->pool, evt_struct); in ibmvscsi_send_srp_event()
996 dev_warn(evt_struct->hostdata->dev, in handle_cmd_rsp()
1008 evt_struct->hostdata->dev); in handle_cmd_rsp()
1042 struct ibmvscsi_host_data *hostdata = shost_priv(cmnd->device->host); in ibmvscsi_queuecommand_lck() local
1047 evt_struct = get_event_struct(&hostdata->pool); in ibmvscsi_queuecommand_lck()
1058 if (!map_data_for_srp_cmd(cmnd, evt_struct, srp_cmd, hostdata->dev)) { in ibmvscsi_queuecommand_lck()
1062 free_event_struct(&hostdata->pool, evt_struct); in ibmvscsi_queuecommand_lck()
1087 return ibmvscsi_send_srp_event(evt_struct, hostdata, 0); in ibmvscsi_queuecommand_lck()
1103 static int map_persist_bufs(struct ibmvscsi_host_data *hostdata) in DEF_SCSI_QCMD()
1106 hostdata->caps_addr = dma_map_single(hostdata->dev, &hostdata->caps, in DEF_SCSI_QCMD()
1107 sizeof(hostdata->caps), DMA_BIDIRECTIONAL); in DEF_SCSI_QCMD()
1109 if (dma_mapping_error(hostdata->dev, hostdata->caps_addr)) { in DEF_SCSI_QCMD()
1110 dev_err(hostdata->dev, "Unable to map capabilities buffer!\n"); in DEF_SCSI_QCMD()
1114 hostdata->adapter_info_addr = dma_map_single(hostdata->dev, in DEF_SCSI_QCMD()
1115 &hostdata->madapter_info, in DEF_SCSI_QCMD()
1116 sizeof(hostdata->madapter_info), in DEF_SCSI_QCMD()
1118 if (dma_mapping_error(hostdata->dev, hostdata->adapter_info_addr)) { in DEF_SCSI_QCMD()
1119 dev_err(hostdata->dev, "Unable to map adapter info buffer!\n"); in DEF_SCSI_QCMD()
1120 dma_unmap_single(hostdata->dev, hostdata->caps_addr, in DEF_SCSI_QCMD()
1121 sizeof(hostdata->caps), DMA_BIDIRECTIONAL); in DEF_SCSI_QCMD()
1134 static void unmap_persist_bufs(struct ibmvscsi_host_data *hostdata) in unmap_persist_bufs() argument
1136 dma_unmap_single(hostdata->dev, hostdata->caps_addr, in unmap_persist_bufs()
1137 sizeof(hostdata->caps), DMA_BIDIRECTIONAL); in unmap_persist_bufs()
1139 dma_unmap_single(hostdata->dev, hostdata->adapter_info_addr, in unmap_persist_bufs()
1140 sizeof(hostdata->madapter_info), DMA_BIDIRECTIONAL); in unmap_persist_bufs()
1152 struct ibmvscsi_host_data *hostdata = evt_struct->hostdata; in login_rsp() local
1157 dev_info(hostdata->dev, "SRP_LOGIN_REJ reason %u\n", in login_rsp()
1160 atomic_set(&hostdata->request_limit, -1); in login_rsp()
1163 dev_err(hostdata->dev, "Invalid login response typecode 0x%02x!\n", in login_rsp()
1166 atomic_set(&hostdata->request_limit, -1); in login_rsp()
1170 dev_info(hostdata->dev, "SRP_LOGIN succeeded\n"); in login_rsp()
1171 hostdata->client_migrated = 0; in login_rsp()
1177 atomic_set(&hostdata->request_limit, in login_rsp()
1181 scsi_unblock_requests(hostdata->host); in login_rsp()
1190 static int send_srp_login(struct ibmvscsi_host_data *hostdata) in send_srp_login() argument
1195 struct srp_event_struct *evt_struct = get_event_struct(&hostdata->pool); in send_srp_login()
1208 spin_lock_irqsave(hostdata->host->host_lock, flags); in send_srp_login()
1213 atomic_set(&hostdata->request_limit, 0); in send_srp_login()
1215 rc = ibmvscsi_send_srp_event(evt_struct, hostdata, login_timeout * 2); in send_srp_login()
1216 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in send_srp_login()
1217 dev_info(hostdata->dev, "sent SRP login\n"); in send_srp_login()
1229 struct ibmvscsi_host_data *hostdata = evt_struct->hostdata; in capabilities_rsp() local
1232 dev_err(hostdata->dev, "error 0x%X getting capabilities info\n", in capabilities_rsp()
1235 if (hostdata->caps.migration.common.server_support != in capabilities_rsp()
1237 dev_info(hostdata->dev, "Partition migration not supported\n"); in capabilities_rsp()
1240 if (hostdata->caps.reserve.common.server_support == in capabilities_rsp()
1242 dev_info(hostdata->dev, "Client reserve enabled\n"); in capabilities_rsp()
1244 dev_info(hostdata->dev, "Client reserve not supported\n"); in capabilities_rsp()
1248 send_srp_login(hostdata); in capabilities_rsp()
1256 static void send_mad_capabilities(struct ibmvscsi_host_data *hostdata) in send_mad_capabilities() argument
1261 struct device_node *of_node = hostdata->dev->of_node; in send_mad_capabilities()
1264 evt_struct = get_event_struct(&hostdata->pool); in send_mad_capabilities()
1273 hostdata->caps.flags = cpu_to_be32(CAP_LIST_SUPPORTED); in send_mad_capabilities()
1274 if (hostdata->client_migrated) in send_mad_capabilities()
1275 hostdata->caps.flags |= cpu_to_be32(CLIENT_MIGRATED); in send_mad_capabilities()
1277 strncpy(hostdata->caps.name, dev_name(&hostdata->host->shost_gendev), in send_mad_capabilities()
1278 sizeof(hostdata->caps.name)); in send_mad_capabilities()
1279 hostdata->caps.name[sizeof(hostdata->caps.name) - 1] = '\0'; in send_mad_capabilities()
1282 location = location ? location : dev_name(hostdata->dev); in send_mad_capabilities()
1283 strncpy(hostdata->caps.loc, location, sizeof(hostdata->caps.loc)); in send_mad_capabilities()
1284 hostdata->caps.loc[sizeof(hostdata->caps.loc) - 1] = '\0'; in send_mad_capabilities()
1287 req->buffer = cpu_to_be64(hostdata->caps_addr); in send_mad_capabilities()
1289 hostdata->caps.migration.common.cap_type = in send_mad_capabilities()
1291 hostdata->caps.migration.common.length = in send_mad_capabilities()
1292 cpu_to_be16(sizeof(hostdata->caps.migration)); in send_mad_capabilities()
1293 hostdata->caps.migration.common.server_support = in send_mad_capabilities()
1295 hostdata->caps.migration.ecl = cpu_to_be32(1); in send_mad_capabilities()
1298 hostdata->caps.reserve.common.cap_type = in send_mad_capabilities()
1300 hostdata->caps.reserve.common.length = in send_mad_capabilities()
1301 cpu_to_be16(sizeof(hostdata->caps.reserve)); in send_mad_capabilities()
1302 hostdata->caps.reserve.common.server_support = in send_mad_capabilities()
1304 hostdata->caps.reserve.type = in send_mad_capabilities()
1307 cpu_to_be16(sizeof(hostdata->caps)); in send_mad_capabilities()
1309 req->common.length = cpu_to_be16(sizeof(hostdata->caps) - in send_mad_capabilities()
1310 sizeof(hostdata->caps.reserve)); in send_mad_capabilities()
1312 spin_lock_irqsave(hostdata->host->host_lock, flags); in send_mad_capabilities()
1313 if (ibmvscsi_send_srp_event(evt_struct, hostdata, info_timeout * 2)) in send_mad_capabilities()
1314 dev_err(hostdata->dev, "couldn't send CAPABILITIES_REQ!\n"); in send_mad_capabilities()
1315 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in send_mad_capabilities()
1327 struct ibmvscsi_host_data *hostdata = evt_struct->hostdata; in fast_fail_rsp() local
1331 dev_err(hostdata->dev, "fast_fail not supported in server\n"); in fast_fail_rsp()
1333 dev_err(hostdata->dev, "fast_fail request failed\n"); in fast_fail_rsp()
1335 dev_err(hostdata->dev, "error 0x%X enabling fast_fail\n", status); in fast_fail_rsp()
1337 send_mad_capabilities(hostdata); in fast_fail_rsp()
1346 static int enable_fast_fail(struct ibmvscsi_host_data *hostdata) in enable_fast_fail() argument
1354 send_mad_capabilities(hostdata); in enable_fast_fail()
1358 evt_struct = get_event_struct(&hostdata->pool); in enable_fast_fail()
1368 spin_lock_irqsave(hostdata->host->host_lock, flags); in enable_fast_fail()
1369 rc = ibmvscsi_send_srp_event(evt_struct, hostdata, info_timeout * 2); in enable_fast_fail()
1370 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in enable_fast_fail()
1383 struct ibmvscsi_host_data *hostdata = evt_struct->hostdata; in adapter_info_rsp() local
1386 dev_err(hostdata->dev, "error %d getting adapter info\n", in adapter_info_rsp()
1389 dev_info(hostdata->dev, "host srp version: %s, " in adapter_info_rsp()
1391 hostdata->madapter_info.srp_version, in adapter_info_rsp()
1392 hostdata->madapter_info.partition_name, in adapter_info_rsp()
1393 be32_to_cpu(hostdata->madapter_info.partition_number), in adapter_info_rsp()
1394 be32_to_cpu(hostdata->madapter_info.os_type), in adapter_info_rsp()
1395 be32_to_cpu(hostdata->madapter_info.port_max_txu[0])); in adapter_info_rsp()
1397 if (hostdata->madapter_info.port_max_txu[0]) in adapter_info_rsp()
1398 hostdata->host->max_sectors = in adapter_info_rsp()
1399 be32_to_cpu(hostdata->madapter_info.port_max_txu[0]) >> 9; in adapter_info_rsp()
1401 if (be32_to_cpu(hostdata->madapter_info.os_type) == 3 && in adapter_info_rsp()
1402 strcmp(hostdata->madapter_info.srp_version, "1.6a") <= 0) { in adapter_info_rsp()
1403 dev_err(hostdata->dev, "host (Ver. %s) doesn't support large transfers\n", in adapter_info_rsp()
1404 hostdata->madapter_info.srp_version); in adapter_info_rsp()
1405 dev_err(hostdata->dev, "limiting scatterlists to %d\n", in adapter_info_rsp()
1407 hostdata->host->sg_tablesize = MAX_INDIRECT_BUFS; in adapter_info_rsp()
1410 if (be32_to_cpu(hostdata->madapter_info.os_type) == 3) { in adapter_info_rsp()
1411 enable_fast_fail(hostdata); in adapter_info_rsp()
1416 send_srp_login(hostdata); in adapter_info_rsp()
1428 static void send_mad_adapter_info(struct ibmvscsi_host_data *hostdata) in send_mad_adapter_info() argument
1434 evt_struct = get_event_struct(&hostdata->pool); in send_mad_adapter_info()
1446 req->common.length = cpu_to_be16(sizeof(hostdata->madapter_info)); in send_mad_adapter_info()
1447 req->buffer = cpu_to_be64(hostdata->adapter_info_addr); in send_mad_adapter_info()
1449 spin_lock_irqsave(hostdata->host->host_lock, flags); in send_mad_adapter_info()
1450 if (ibmvscsi_send_srp_event(evt_struct, hostdata, info_timeout * 2)) in send_mad_adapter_info()
1451 dev_err(hostdata->dev, "couldn't send ADAPTER_INFO_REQ!\n"); in send_mad_adapter_info()
1452 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in send_mad_adapter_info()
1459 static void init_adapter(struct ibmvscsi_host_data *hostdata) in init_adapter() argument
1461 send_mad_adapter_info(hostdata); in init_adapter()
1485 struct ibmvscsi_host_data *hostdata = shost_priv(cmd->device->host); in ibmvscsi_eh_abort_handler() local
1498 spin_lock_irqsave(hostdata->host->host_lock, flags); in ibmvscsi_eh_abort_handler()
1502 list_for_each_entry(tmp_evt, &hostdata->sent, list) { in ibmvscsi_eh_abort_handler()
1510 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_eh_abort_handler()
1514 evt = get_event_struct(&hostdata->pool); in ibmvscsi_eh_abort_handler()
1516 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_eh_abort_handler()
1539 rsp_rc = ibmvscsi_send_srp_event(evt, hostdata, abort_timeout * 2); in ibmvscsi_eh_abort_handler()
1544 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_eh_abort_handler()
1546 spin_lock_irqsave(hostdata->host->host_lock, flags); in ibmvscsi_eh_abort_handler()
1549 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_eh_abort_handler()
1588 spin_lock_irqsave(hostdata->host->host_lock, flags); in ibmvscsi_eh_abort_handler()
1590 list_for_each_entry(tmp_evt, &hostdata->sent, list) { in ibmvscsi_eh_abort_handler()
1598 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_eh_abort_handler()
1610 found_evt->hostdata->dev); in ibmvscsi_eh_abort_handler()
1611 free_event_struct(&found_evt->hostdata->pool, found_evt); in ibmvscsi_eh_abort_handler()
1612 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_eh_abort_handler()
1613 atomic_inc(&hostdata->request_limit); in ibmvscsi_eh_abort_handler()
1624 struct ibmvscsi_host_data *hostdata = shost_priv(cmd->device->host); in ibmvscsi_eh_device_reset_handler() local
1634 spin_lock_irqsave(hostdata->host->host_lock, flags); in ibmvscsi_eh_device_reset_handler()
1637 evt = get_event_struct(&hostdata->pool); in ibmvscsi_eh_device_reset_handler()
1639 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_eh_device_reset_handler()
1661 rsp_rc = ibmvscsi_send_srp_event(evt, hostdata, reset_timeout * 2); in ibmvscsi_eh_device_reset_handler()
1666 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_eh_device_reset_handler()
1668 spin_lock_irqsave(hostdata->host->host_lock, flags); in ibmvscsi_eh_device_reset_handler()
1671 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_eh_device_reset_handler()
1708 spin_lock_irqsave(hostdata->host->host_lock, flags); in ibmvscsi_eh_device_reset_handler()
1709 list_for_each_entry_safe(tmp_evt, pos, &hostdata->sent, list) { in ibmvscsi_eh_device_reset_handler()
1715 tmp_evt->hostdata->dev); in ibmvscsi_eh_device_reset_handler()
1716 free_event_struct(&tmp_evt->hostdata->pool, in ibmvscsi_eh_device_reset_handler()
1718 atomic_inc(&hostdata->request_limit); in ibmvscsi_eh_device_reset_handler()
1725 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_eh_device_reset_handler()
1736 struct ibmvscsi_host_data *hostdata = shost_priv(cmd->device->host); in ibmvscsi_eh_host_reset_handler() local
1738 dev_err(hostdata->dev, "Resetting connection due to error recovery\n"); in ibmvscsi_eh_host_reset_handler()
1740 ibmvscsi_reset_host(hostdata); in ibmvscsi_eh_host_reset_handler()
1744 atomic_read(&hostdata->request_limit) < 2;) { in ibmvscsi_eh_host_reset_handler()
1749 if (atomic_read(&hostdata->request_limit) <= 0) in ibmvscsi_eh_host_reset_handler()
1762 struct ibmvscsi_host_data *hostdata) in ibmvscsi_handle_crq() argument
1773 dev_info(hostdata->dev, "partner initialized\n"); in ibmvscsi_handle_crq()
1775 rc = ibmvscsi_send_crq(hostdata, 0xC002000000000000LL, 0); in ibmvscsi_handle_crq()
1778 init_adapter(hostdata); in ibmvscsi_handle_crq()
1780 dev_err(hostdata->dev, "Unable to send init rsp. rc=%ld\n", rc); in ibmvscsi_handle_crq()
1785 dev_info(hostdata->dev, "partner initialization complete\n"); in ibmvscsi_handle_crq()
1788 init_adapter(hostdata); in ibmvscsi_handle_crq()
1791 dev_err(hostdata->dev, "unknown crq message type: %d\n", crq->format); in ibmvscsi_handle_crq()
1795 scsi_block_requests(hostdata->host); in ibmvscsi_handle_crq()
1796 atomic_set(&hostdata->request_limit, 0); in ibmvscsi_handle_crq()
1799 dev_info(hostdata->dev, "Re-enabling adapter!\n"); in ibmvscsi_handle_crq()
1800 hostdata->client_migrated = 1; in ibmvscsi_handle_crq()
1801 hostdata->reenable_crq = 1; in ibmvscsi_handle_crq()
1802 purge_requests(hostdata, DID_REQUEUE); in ibmvscsi_handle_crq()
1803 wake_up(&hostdata->work_wait_q); in ibmvscsi_handle_crq()
1805 dev_err(hostdata->dev, "Virtual adapter failed rc %d!\n", in ibmvscsi_handle_crq()
1807 ibmvscsi_reset_host(hostdata); in ibmvscsi_handle_crq()
1813 dev_err(hostdata->dev, "got an invalid message type 0x%02x\n", in ibmvscsi_handle_crq()
1822 if (!valid_event_struct(&hostdata->pool, evt_struct)) { in ibmvscsi_handle_crq()
1823 dev_err(hostdata->dev, "returned correlation_token 0x%p is invalid!\n", in ibmvscsi_handle_crq()
1829 dev_err(hostdata->dev, "received duplicate correlation_token 0x%p!\n", in ibmvscsi_handle_crq()
1836 &hostdata->request_limit); in ibmvscsi_handle_crq()
1845 dev_err(hostdata->dev, "returned done() is NULL; not running it!\n"); in ibmvscsi_handle_crq()
1851 spin_lock_irqsave(evt_struct->hostdata->host->host_lock, flags); in ibmvscsi_handle_crq()
1853 free_event_struct(&evt_struct->hostdata->pool, evt_struct); in ibmvscsi_handle_crq()
1854 spin_unlock_irqrestore(evt_struct->hostdata->host->host_lock, flags); in ibmvscsi_handle_crq()
1861 static int ibmvscsi_do_host_config(struct ibmvscsi_host_data *hostdata, in ibmvscsi_do_host_config() argument
1870 evt_struct = get_event_struct(&hostdata->pool); in ibmvscsi_do_host_config()
1872 dev_err(hostdata->dev, "couldn't allocate event for HOST_CONFIG!\n"); in ibmvscsi_do_host_config()
1890 addr = dma_map_single(hostdata->dev, buffer, length, DMA_BIDIRECTIONAL); in ibmvscsi_do_host_config()
1892 if (dma_mapping_error(hostdata->dev, addr)) { in ibmvscsi_do_host_config()
1894 dev_err(hostdata->dev, in ibmvscsi_do_host_config()
1896 free_event_struct(&hostdata->pool, evt_struct); in ibmvscsi_do_host_config()
1903 spin_lock_irqsave(hostdata->host->host_lock, flags); in ibmvscsi_do_host_config()
1904 rc = ibmvscsi_send_srp_event(evt_struct, hostdata, info_timeout * 2); in ibmvscsi_do_host_config()
1905 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_do_host_config()
1908 dma_unmap_single(hostdata->dev, addr, length, DMA_BIDIRECTIONAL); in ibmvscsi_do_host_config()
1958 struct ibmvscsi_host_data *hostdata = shost_priv(shost); in show_host_vhost_loc() local
1961 len = snprintf(buf, sizeof(hostdata->caps.loc), "%s\n", in show_host_vhost_loc()
1962 hostdata->caps.loc); in show_host_vhost_loc()
1978 struct ibmvscsi_host_data *hostdata = shost_priv(shost); in show_host_vhost_name() local
1981 len = snprintf(buf, sizeof(hostdata->caps.name), "%s\n", in show_host_vhost_name()
1982 hostdata->caps.name); in show_host_vhost_name()
1998 struct ibmvscsi_host_data *hostdata = shost_priv(shost); in show_host_srp_version() local
2002 hostdata->madapter_info.srp_version); in show_host_srp_version()
2019 struct ibmvscsi_host_data *hostdata = shost_priv(shost); in show_host_partition_name() local
2023 hostdata->madapter_info.partition_name); in show_host_partition_name()
2040 struct ibmvscsi_host_data *hostdata = shost_priv(shost); in show_host_partition_number() local
2044 hostdata->madapter_info.partition_number); in show_host_partition_number()
2060 struct ibmvscsi_host_data *hostdata = shost_priv(shost); in show_host_mad_version() local
2064 hostdata->madapter_info.mad_version); in show_host_mad_version()
2080 struct ibmvscsi_host_data *hostdata = shost_priv(shost); in show_host_os_type() local
2083 len = snprintf(buf, PAGE_SIZE, "%d\n", hostdata->madapter_info.os_type); in show_host_os_type()
2099 struct ibmvscsi_host_data *hostdata = shost_priv(shost); in show_host_config() local
2102 if (ibmvscsi_do_host_config(hostdata, buf, PAGE_SIZE) == 0) in show_host_config()
2169 static void ibmvscsi_do_work(struct ibmvscsi_host_data *hostdata) in ibmvscsi_do_work() argument
2174 if (hostdata->reset_crq) { in ibmvscsi_do_work()
2176 hostdata->reset_crq = 0; in ibmvscsi_do_work()
2178 rc = ibmvscsi_reset_crq_queue(&hostdata->queue, hostdata); in ibmvscsi_do_work()
2180 rc = ibmvscsi_send_crq(hostdata, 0xC001000000000000LL, 0); in ibmvscsi_do_work()
2181 vio_enable_interrupts(to_vio_dev(hostdata->dev)); in ibmvscsi_do_work()
2182 } else if (hostdata->reenable_crq) { in ibmvscsi_do_work()
2185 rc = ibmvscsi_reenable_crq_queue(&hostdata->queue, hostdata); in ibmvscsi_do_work()
2186 hostdata->reenable_crq = 0; in ibmvscsi_do_work()
2188 rc = ibmvscsi_send_crq(hostdata, 0xC001000000000000LL, 0); in ibmvscsi_do_work()
2193 atomic_set(&hostdata->request_limit, -1); in ibmvscsi_do_work()
2194 dev_err(hostdata->dev, "error after %s\n", action); in ibmvscsi_do_work()
2197 scsi_unblock_requests(hostdata->host); in ibmvscsi_do_work()
2200 static int ibmvscsi_work_to_do(struct ibmvscsi_host_data *hostdata) in ibmvscsi_work_to_do() argument
2204 else if (hostdata->reset_crq) { in ibmvscsi_work_to_do()
2207 } else if (hostdata->reenable_crq) { in ibmvscsi_work_to_do()
2217 struct ibmvscsi_host_data *hostdata = data; in ibmvscsi_work() local
2223 rc = wait_event_interruptible(hostdata->work_wait_q, in ibmvscsi_work()
2224 ibmvscsi_work_to_do(hostdata)); in ibmvscsi_work()
2231 ibmvscsi_do_work(hostdata); in ibmvscsi_work()
2242 struct ibmvscsi_host_data *hostdata; in ibmvscsi_probe() local
2252 host = scsi_host_alloc(&driver_template, sizeof(*hostdata)); in ibmvscsi_probe()
2259 hostdata = shost_priv(host); in ibmvscsi_probe()
2260 memset(hostdata, 0x00, sizeof(*hostdata)); in ibmvscsi_probe()
2261 INIT_LIST_HEAD(&hostdata->sent); in ibmvscsi_probe()
2262 init_waitqueue_head(&hostdata->work_wait_q); in ibmvscsi_probe()
2263 hostdata->host = host; in ibmvscsi_probe()
2264 hostdata->dev = dev; in ibmvscsi_probe()
2265 atomic_set(&hostdata->request_limit, -1); in ibmvscsi_probe()
2266 hostdata->host->max_sectors = IBMVSCSI_MAX_SECTORS_DEFAULT; in ibmvscsi_probe()
2268 if (map_persist_bufs(hostdata)) { in ibmvscsi_probe()
2273 hostdata->work_thread = kthread_run(ibmvscsi_work, hostdata, "%s_%d", in ibmvscsi_probe()
2276 if (IS_ERR(hostdata->work_thread)) { in ibmvscsi_probe()
2278 PTR_ERR(hostdata->work_thread)); in ibmvscsi_probe()
2282 rc = ibmvscsi_init_crq_queue(&hostdata->queue, hostdata, max_events); in ibmvscsi_probe()
2287 if (initialize_event_pool(&hostdata->pool, max_events, hostdata) != 0) { in ibmvscsi_probe()
2301 if (scsi_add_host(hostdata->host, hostdata->dev)) in ibmvscsi_probe()
2305 memcpy(ids.port_id, hostdata->madapter_info.partition_name, in ibmvscsi_probe()
2316 if (ibmvscsi_send_crq(hostdata, 0xC001000000000000LL, 0) == 0 in ibmvscsi_probe()
2326 atomic_read(&hostdata->request_limit) < 2;) { in ibmvscsi_probe()
2332 if (atomic_read(&hostdata->request_limit) > 0) in ibmvscsi_probe()
2336 dev_set_drvdata(&vdev->dev, hostdata); in ibmvscsi_probe()
2340 scsi_remove_host(hostdata->host); in ibmvscsi_probe()
2342 release_event_pool(&hostdata->pool, hostdata); in ibmvscsi_probe()
2344 ibmvscsi_release_crq_queue(&hostdata->queue, hostdata, max_events); in ibmvscsi_probe()
2346 kthread_stop(hostdata->work_thread); in ibmvscsi_probe()
2348 unmap_persist_bufs(hostdata); in ibmvscsi_probe()
2357 struct ibmvscsi_host_data *hostdata = dev_get_drvdata(&vdev->dev); in ibmvscsi_remove() local
2358 unmap_persist_bufs(hostdata); in ibmvscsi_remove()
2359 release_event_pool(&hostdata->pool, hostdata); in ibmvscsi_remove()
2360 ibmvscsi_release_crq_queue(&hostdata->queue, hostdata, in ibmvscsi_remove()
2363 kthread_stop(hostdata->work_thread); in ibmvscsi_remove()
2364 srp_remove_host(hostdata->host); in ibmvscsi_remove()
2365 scsi_remove_host(hostdata->host); in ibmvscsi_remove()
2366 scsi_host_put(hostdata->host); in ibmvscsi_remove()
2380 struct ibmvscsi_host_data *hostdata = dev_get_drvdata(dev); in ibmvscsi_resume() local
2381 vio_disable_interrupts(to_vio_dev(hostdata->dev)); in ibmvscsi_resume()
2382 tasklet_schedule(&hostdata->srp_task); in ibmvscsi_resume()