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()
141 struct ibmvscsi_host_data *hostdata, in ibmvscsi_release_crq_queue() argument
145 struct vio_dev *vdev = to_vio_dev(hostdata->dev); in ibmvscsi_release_crq_queue()
146 free_irq(vdev->irq, (void *)hostdata); in ibmvscsi_release_crq_queue()
147 tasklet_kill(&hostdata->srp_task); in ibmvscsi_release_crq_queue()
153 dma_unmap_single(hostdata->dev, in ibmvscsi_release_crq_queue()
194 static int ibmvscsi_send_crq(struct ibmvscsi_host_data *hostdata, in ibmvscsi_send_crq() argument
197 struct vio_dev *vdev = to_vio_dev(hostdata->dev); in ibmvscsi_send_crq()
213 struct ibmvscsi_host_data *hostdata = (struct ibmvscsi_host_data *)data; in ibmvscsi_task() local
214 struct vio_dev *vdev = to_vio_dev(hostdata->dev); in ibmvscsi_task()
220 while ((crq = crq_queue_next_crq(&hostdata->queue)) != NULL) { in ibmvscsi_task()
221 ibmvscsi_handle_crq(crq, hostdata); in ibmvscsi_task()
227 crq = crq_queue_next_crq(&hostdata->queue); in ibmvscsi_task()
230 ibmvscsi_handle_crq(crq, hostdata); in ibmvscsi_task()
260 static void set_adapter_info(struct ibmvscsi_host_data *hostdata) in set_adapter_info() argument
262 memset(&hostdata->madapter_info, 0x00, in set_adapter_info()
263 sizeof(hostdata->madapter_info)); in set_adapter_info()
265 dev_info(hostdata->dev, "SRP_VERSION: %s\n", SRP_VERSION); in set_adapter_info()
266 strcpy(hostdata->madapter_info.srp_version, SRP_VERSION); in set_adapter_info()
268 strncpy(hostdata->madapter_info.partition_name, partition_name, in set_adapter_info()
269 sizeof(hostdata->madapter_info.partition_name)); in set_adapter_info()
271 hostdata->madapter_info.partition_number = in set_adapter_info()
274 hostdata->madapter_info.mad_version = cpu_to_be32(SRP_MAD_VERSION_1); in set_adapter_info()
275 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()
326 struct ibmvscsi_host_data *hostdata, in ibmvscsi_init_crq_queue() argument
331 struct vio_dev *vdev = to_vio_dev(hostdata->dev); in ibmvscsi_init_crq_queue()
339 queue->msg_token = dma_map_single(hostdata->dev, queue->msgs, in ibmvscsi_init_crq_queue()
343 if (dma_mapping_error(hostdata->dev, queue->msg_token)) in ibmvscsi_init_crq_queue()
347 set_adapter_info(hostdata); in ibmvscsi_init_crq_queue()
355 hostdata); in ibmvscsi_init_crq_queue()
359 dev_warn(hostdata->dev, "Partner adapter not ready\n"); in ibmvscsi_init_crq_queue()
362 dev_warn(hostdata->dev, "Error %d opening adapter\n", rc); in ibmvscsi_init_crq_queue()
369 tasklet_init(&hostdata->srp_task, (void *)ibmvscsi_task, in ibmvscsi_init_crq_queue()
370 (unsigned long)hostdata); in ibmvscsi_init_crq_queue()
374 0, "ibmvscsi", (void *)hostdata) != 0) { in ibmvscsi_init_crq_queue()
375 dev_err(hostdata->dev, "couldn't register irq 0x%x\n", in ibmvscsi_init_crq_queue()
382 dev_err(hostdata->dev, "Error %d enabling interrupts!!!\n", rc); in ibmvscsi_init_crq_queue()
389 tasklet_kill(&hostdata->srp_task); in ibmvscsi_init_crq_queue()
397 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()
426 dev_err(hostdata->dev, "Error %d enabling adapter\n", rc); in ibmvscsi_reenable_crq_queue()
442 int size, struct ibmvscsi_host_data *hostdata) in initialize_event_pool() argument
453 dma_alloc_coherent(hostdata->dev, in initialize_event_pool()
470 evt->hostdata = hostdata; in initialize_event_pool()
486 struct ibmvscsi_host_data *hostdata) in release_event_pool() argument
493 dma_free_coherent(hostdata->dev, in release_event_pool()
500 dev_warn(hostdata->dev, "releasing event pool with %d " in release_event_pool()
503 dma_free_coherent(hostdata->dev, in release_event_pool()
536 dev_err(evt->hostdata->dev, "Freeing invalid event_struct %p " in free_event_struct()
541 dev_err(evt->hostdata->dev, "Freeing event_struct %p " in free_event_struct()
780 static void purge_requests(struct ibmvscsi_host_data *hostdata, int error_code) in purge_requests() argument
785 spin_lock_irqsave(hostdata->host->host_lock, flags); in purge_requests()
786 while (!list_empty(&hostdata->sent)) { in purge_requests()
787 evt = list_first_entry(&hostdata->sent, struct srp_event_struct, list); in purge_requests()
791 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in purge_requests()
795 evt->hostdata->dev); in purge_requests()
801 free_event_struct(&evt->hostdata->pool, evt); in purge_requests()
802 spin_lock_irqsave(hostdata->host->host_lock, flags); in purge_requests()
804 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in purge_requests()
811 static void ibmvscsi_reset_host(struct ibmvscsi_host_data *hostdata) in ibmvscsi_reset_host() argument
813 scsi_block_requests(hostdata->host); in ibmvscsi_reset_host()
814 atomic_set(&hostdata->request_limit, 0); in ibmvscsi_reset_host()
816 purge_requests(hostdata, DID_ERROR); in ibmvscsi_reset_host()
817 hostdata->action = IBMVSCSI_HOST_ACTION_RESET; in ibmvscsi_reset_host()
818 wake_up(&hostdata->work_wait_q); in ibmvscsi_reset_host()
830 struct ibmvscsi_host_data *hostdata = evt_struct->hostdata; in ibmvscsi_timeout() local
832 dev_err(hostdata->dev, "Command timed out (%x). Resetting connection\n", in ibmvscsi_timeout()
835 ibmvscsi_reset_host(hostdata); in ibmvscsi_timeout()
852 struct ibmvscsi_host_data *hostdata, in ibmvscsi_send_srp_event() argument
869 atomic_dec_if_positive(&hostdata->request_limit); in ibmvscsi_send_srp_event()
899 list_for_each_entry(tmp_evt, &hostdata->sent, list) { in ibmvscsi_send_srp_event()
916 list_add_tail(&evt_struct->list, &hostdata->sent); in ibmvscsi_send_srp_event()
924 rc = ibmvscsi_send_crq(hostdata, be64_to_cpu(crq_as_u64[0]), in ibmvscsi_send_srp_event()
936 dev_warn(hostdata->dev, "send warning. " in ibmvscsi_send_srp_event()
940 dev_err(hostdata->dev, "send error %d\n", rc); in ibmvscsi_send_srp_event()
942 atomic_inc(&hostdata->request_limit); in ibmvscsi_send_srp_event()
949 unmap_cmd_data(&evt_struct->iu.srp.cmd, evt_struct, hostdata->dev); in ibmvscsi_send_srp_event()
951 free_event_struct(&hostdata->pool, evt_struct); in ibmvscsi_send_srp_event()
953 atomic_inc(&hostdata->request_limit); in ibmvscsi_send_srp_event()
957 unmap_cmd_data(&evt_struct->iu.srp.cmd, evt_struct, hostdata->dev); in ibmvscsi_send_srp_event()
965 free_event_struct(&hostdata->pool, evt_struct); in ibmvscsi_send_srp_event()
983 dev_warn(evt_struct->hostdata->dev, in handle_cmd_rsp()
995 evt_struct->hostdata->dev); in handle_cmd_rsp()
1029 struct ibmvscsi_host_data *hostdata = shost_priv(cmnd->device->host); in ibmvscsi_queuecommand_lck() local
1034 evt_struct = get_event_struct(&hostdata->pool); in ibmvscsi_queuecommand_lck()
1045 if (!map_data_for_srp_cmd(cmnd, evt_struct, srp_cmd, hostdata->dev)) { in ibmvscsi_queuecommand_lck()
1049 free_event_struct(&hostdata->pool, evt_struct); in ibmvscsi_queuecommand_lck()
1074 return ibmvscsi_send_srp_event(evt_struct, hostdata, 0); in ibmvscsi_queuecommand_lck()
1090 static int map_persist_bufs(struct ibmvscsi_host_data *hostdata) in DEF_SCSI_QCMD()
1093 hostdata->caps_addr = dma_map_single(hostdata->dev, &hostdata->caps, in DEF_SCSI_QCMD()
1094 sizeof(hostdata->caps), DMA_BIDIRECTIONAL); in DEF_SCSI_QCMD()
1096 if (dma_mapping_error(hostdata->dev, hostdata->caps_addr)) { in DEF_SCSI_QCMD()
1097 dev_err(hostdata->dev, "Unable to map capabilities buffer!\n"); in DEF_SCSI_QCMD()
1101 hostdata->adapter_info_addr = dma_map_single(hostdata->dev, in DEF_SCSI_QCMD()
1102 &hostdata->madapter_info, in DEF_SCSI_QCMD()
1103 sizeof(hostdata->madapter_info), in DEF_SCSI_QCMD()
1105 if (dma_mapping_error(hostdata->dev, hostdata->adapter_info_addr)) { in DEF_SCSI_QCMD()
1106 dev_err(hostdata->dev, "Unable to map adapter info buffer!\n"); in DEF_SCSI_QCMD()
1107 dma_unmap_single(hostdata->dev, hostdata->caps_addr, in DEF_SCSI_QCMD()
1108 sizeof(hostdata->caps), DMA_BIDIRECTIONAL); in DEF_SCSI_QCMD()
1121 static void unmap_persist_bufs(struct ibmvscsi_host_data *hostdata) in unmap_persist_bufs() argument
1123 dma_unmap_single(hostdata->dev, hostdata->caps_addr, in unmap_persist_bufs()
1124 sizeof(hostdata->caps), DMA_BIDIRECTIONAL); in unmap_persist_bufs()
1126 dma_unmap_single(hostdata->dev, hostdata->adapter_info_addr, in unmap_persist_bufs()
1127 sizeof(hostdata->madapter_info), DMA_BIDIRECTIONAL); in unmap_persist_bufs()
1139 struct ibmvscsi_host_data *hostdata = evt_struct->hostdata; in login_rsp() local
1144 dev_info(hostdata->dev, "SRP_LOGIN_REJ reason %u\n", in login_rsp()
1147 atomic_set(&hostdata->request_limit, -1); in login_rsp()
1150 dev_err(hostdata->dev, "Invalid login response typecode 0x%02x!\n", in login_rsp()
1153 atomic_set(&hostdata->request_limit, -1); in login_rsp()
1157 dev_info(hostdata->dev, "SRP_LOGIN succeeded\n"); in login_rsp()
1158 hostdata->client_migrated = 0; in login_rsp()
1164 atomic_set(&hostdata->request_limit, in login_rsp()
1168 hostdata->action = IBMVSCSI_HOST_ACTION_UNBLOCK; in login_rsp()
1169 wake_up(&hostdata->work_wait_q); in login_rsp()
1178 static int send_srp_login(struct ibmvscsi_host_data *hostdata) in send_srp_login() argument
1183 struct srp_event_struct *evt_struct = get_event_struct(&hostdata->pool); in send_srp_login()
1196 spin_lock_irqsave(hostdata->host->host_lock, flags); in send_srp_login()
1201 atomic_set(&hostdata->request_limit, 0); in send_srp_login()
1203 rc = ibmvscsi_send_srp_event(evt_struct, hostdata, login_timeout * 2); in send_srp_login()
1204 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in send_srp_login()
1205 dev_info(hostdata->dev, "sent SRP login\n"); in send_srp_login()
1217 struct ibmvscsi_host_data *hostdata = evt_struct->hostdata; in capabilities_rsp() local
1220 dev_err(hostdata->dev, "error 0x%X getting capabilities info\n", in capabilities_rsp()
1223 if (hostdata->caps.migration.common.server_support != in capabilities_rsp()
1225 dev_info(hostdata->dev, "Partition migration not supported\n"); in capabilities_rsp()
1228 if (hostdata->caps.reserve.common.server_support == in capabilities_rsp()
1230 dev_info(hostdata->dev, "Client reserve enabled\n"); in capabilities_rsp()
1232 dev_info(hostdata->dev, "Client reserve not supported\n"); in capabilities_rsp()
1236 send_srp_login(hostdata); in capabilities_rsp()
1244 static void send_mad_capabilities(struct ibmvscsi_host_data *hostdata) in send_mad_capabilities() argument
1249 struct device_node *of_node = hostdata->dev->of_node; in send_mad_capabilities()
1252 evt_struct = get_event_struct(&hostdata->pool); in send_mad_capabilities()
1261 hostdata->caps.flags = cpu_to_be32(CAP_LIST_SUPPORTED); in send_mad_capabilities()
1262 if (hostdata->client_migrated) in send_mad_capabilities()
1263 hostdata->caps.flags |= cpu_to_be32(CLIENT_MIGRATED); in send_mad_capabilities()
1265 strlcpy(hostdata->caps.name, dev_name(&hostdata->host->shost_gendev), in send_mad_capabilities()
1266 sizeof(hostdata->caps.name)); in send_mad_capabilities()
1269 location = location ? location : dev_name(hostdata->dev); in send_mad_capabilities()
1270 strlcpy(hostdata->caps.loc, location, sizeof(hostdata->caps.loc)); in send_mad_capabilities()
1273 req->buffer = cpu_to_be64(hostdata->caps_addr); in send_mad_capabilities()
1275 hostdata->caps.migration.common.cap_type = in send_mad_capabilities()
1277 hostdata->caps.migration.common.length = in send_mad_capabilities()
1278 cpu_to_be16(sizeof(hostdata->caps.migration)); in send_mad_capabilities()
1279 hostdata->caps.migration.common.server_support = in send_mad_capabilities()
1281 hostdata->caps.migration.ecl = cpu_to_be32(1); in send_mad_capabilities()
1284 hostdata->caps.reserve.common.cap_type = in send_mad_capabilities()
1286 hostdata->caps.reserve.common.length = in send_mad_capabilities()
1287 cpu_to_be16(sizeof(hostdata->caps.reserve)); in send_mad_capabilities()
1288 hostdata->caps.reserve.common.server_support = in send_mad_capabilities()
1290 hostdata->caps.reserve.type = in send_mad_capabilities()
1293 cpu_to_be16(sizeof(hostdata->caps)); in send_mad_capabilities()
1295 req->common.length = cpu_to_be16(sizeof(hostdata->caps) - in send_mad_capabilities()
1296 sizeof(hostdata->caps.reserve)); in send_mad_capabilities()
1298 spin_lock_irqsave(hostdata->host->host_lock, flags); in send_mad_capabilities()
1299 if (ibmvscsi_send_srp_event(evt_struct, hostdata, info_timeout * 2)) in send_mad_capabilities()
1300 dev_err(hostdata->dev, "couldn't send CAPABILITIES_REQ!\n"); in send_mad_capabilities()
1301 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in send_mad_capabilities()
1313 struct ibmvscsi_host_data *hostdata = evt_struct->hostdata; in fast_fail_rsp() local
1317 dev_err(hostdata->dev, "fast_fail not supported in server\n"); in fast_fail_rsp()
1319 dev_err(hostdata->dev, "fast_fail request failed\n"); in fast_fail_rsp()
1321 dev_err(hostdata->dev, "error 0x%X enabling fast_fail\n", status); in fast_fail_rsp()
1323 send_mad_capabilities(hostdata); in fast_fail_rsp()
1332 static int enable_fast_fail(struct ibmvscsi_host_data *hostdata) in enable_fast_fail() argument
1340 send_mad_capabilities(hostdata); in enable_fast_fail()
1344 evt_struct = get_event_struct(&hostdata->pool); in enable_fast_fail()
1354 spin_lock_irqsave(hostdata->host->host_lock, flags); in enable_fast_fail()
1355 rc = ibmvscsi_send_srp_event(evt_struct, hostdata, info_timeout * 2); in enable_fast_fail()
1356 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in enable_fast_fail()
1369 struct ibmvscsi_host_data *hostdata = evt_struct->hostdata; in adapter_info_rsp() local
1372 dev_err(hostdata->dev, "error %d getting adapter info\n", in adapter_info_rsp()
1375 dev_info(hostdata->dev, "host srp version: %s, " in adapter_info_rsp()
1377 hostdata->madapter_info.srp_version, in adapter_info_rsp()
1378 hostdata->madapter_info.partition_name, in adapter_info_rsp()
1379 be32_to_cpu(hostdata->madapter_info.partition_number), in adapter_info_rsp()
1380 be32_to_cpu(hostdata->madapter_info.os_type), in adapter_info_rsp()
1381 be32_to_cpu(hostdata->madapter_info.port_max_txu[0])); in adapter_info_rsp()
1383 if (hostdata->madapter_info.port_max_txu[0]) in adapter_info_rsp()
1384 hostdata->host->max_sectors = in adapter_info_rsp()
1385 be32_to_cpu(hostdata->madapter_info.port_max_txu[0]) >> 9; in adapter_info_rsp()
1387 if (be32_to_cpu(hostdata->madapter_info.os_type) == SRP_MAD_OS_AIX && in adapter_info_rsp()
1388 strcmp(hostdata->madapter_info.srp_version, "1.6a") <= 0) { in adapter_info_rsp()
1389 dev_err(hostdata->dev, "host (Ver. %s) doesn't support large transfers\n", in adapter_info_rsp()
1390 hostdata->madapter_info.srp_version); in adapter_info_rsp()
1391 dev_err(hostdata->dev, "limiting scatterlists to %d\n", in adapter_info_rsp()
1393 hostdata->host->sg_tablesize = MAX_INDIRECT_BUFS; in adapter_info_rsp()
1396 if (be32_to_cpu(hostdata->madapter_info.os_type) == SRP_MAD_OS_AIX) { in adapter_info_rsp()
1397 enable_fast_fail(hostdata); in adapter_info_rsp()
1402 send_srp_login(hostdata); in adapter_info_rsp()
1414 static void send_mad_adapter_info(struct ibmvscsi_host_data *hostdata) in send_mad_adapter_info() argument
1420 evt_struct = get_event_struct(&hostdata->pool); in send_mad_adapter_info()
1432 req->common.length = cpu_to_be16(sizeof(hostdata->madapter_info)); in send_mad_adapter_info()
1433 req->buffer = cpu_to_be64(hostdata->adapter_info_addr); in send_mad_adapter_info()
1435 spin_lock_irqsave(hostdata->host->host_lock, flags); in send_mad_adapter_info()
1436 if (ibmvscsi_send_srp_event(evt_struct, hostdata, info_timeout * 2)) in send_mad_adapter_info()
1437 dev_err(hostdata->dev, "couldn't send ADAPTER_INFO_REQ!\n"); in send_mad_adapter_info()
1438 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in send_mad_adapter_info()
1445 static void init_adapter(struct ibmvscsi_host_data *hostdata) in init_adapter() argument
1447 send_mad_adapter_info(hostdata); in init_adapter()
1471 struct ibmvscsi_host_data *hostdata = shost_priv(cmd->device->host); in ibmvscsi_eh_abort_handler() local
1484 spin_lock_irqsave(hostdata->host->host_lock, flags); in ibmvscsi_eh_abort_handler()
1488 list_for_each_entry(tmp_evt, &hostdata->sent, list) { in ibmvscsi_eh_abort_handler()
1496 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_eh_abort_handler()
1500 evt = get_event_struct(&hostdata->pool); in ibmvscsi_eh_abort_handler()
1502 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_eh_abort_handler()
1525 rsp_rc = ibmvscsi_send_srp_event(evt, hostdata, abort_timeout * 2); in ibmvscsi_eh_abort_handler()
1530 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_eh_abort_handler()
1532 spin_lock_irqsave(hostdata->host->host_lock, flags); in ibmvscsi_eh_abort_handler()
1535 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_eh_abort_handler()
1574 spin_lock_irqsave(hostdata->host->host_lock, flags); in ibmvscsi_eh_abort_handler()
1576 list_for_each_entry(tmp_evt, &hostdata->sent, list) { in ibmvscsi_eh_abort_handler()
1584 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_eh_abort_handler()
1596 found_evt->hostdata->dev); in ibmvscsi_eh_abort_handler()
1597 free_event_struct(&found_evt->hostdata->pool, found_evt); in ibmvscsi_eh_abort_handler()
1598 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_eh_abort_handler()
1599 atomic_inc(&hostdata->request_limit); in ibmvscsi_eh_abort_handler()
1610 struct ibmvscsi_host_data *hostdata = shost_priv(cmd->device->host); in ibmvscsi_eh_device_reset_handler() local
1620 spin_lock_irqsave(hostdata->host->host_lock, flags); in ibmvscsi_eh_device_reset_handler()
1623 evt = get_event_struct(&hostdata->pool); in ibmvscsi_eh_device_reset_handler()
1625 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_eh_device_reset_handler()
1647 rsp_rc = ibmvscsi_send_srp_event(evt, hostdata, reset_timeout * 2); in ibmvscsi_eh_device_reset_handler()
1652 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_eh_device_reset_handler()
1654 spin_lock_irqsave(hostdata->host->host_lock, flags); in ibmvscsi_eh_device_reset_handler()
1657 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_eh_device_reset_handler()
1694 spin_lock_irqsave(hostdata->host->host_lock, flags); in ibmvscsi_eh_device_reset_handler()
1695 list_for_each_entry_safe(tmp_evt, pos, &hostdata->sent, list) { in ibmvscsi_eh_device_reset_handler()
1701 tmp_evt->hostdata->dev); in ibmvscsi_eh_device_reset_handler()
1702 free_event_struct(&tmp_evt->hostdata->pool, in ibmvscsi_eh_device_reset_handler()
1704 atomic_inc(&hostdata->request_limit); in ibmvscsi_eh_device_reset_handler()
1711 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_eh_device_reset_handler()
1722 struct ibmvscsi_host_data *hostdata = shost_priv(cmd->device->host); in ibmvscsi_eh_host_reset_handler() local
1724 dev_err(hostdata->dev, "Resetting connection due to error recovery\n"); in ibmvscsi_eh_host_reset_handler()
1726 ibmvscsi_reset_host(hostdata); in ibmvscsi_eh_host_reset_handler()
1730 atomic_read(&hostdata->request_limit) < 2;) { in ibmvscsi_eh_host_reset_handler()
1735 if (atomic_read(&hostdata->request_limit) <= 0) in ibmvscsi_eh_host_reset_handler()
1748 struct ibmvscsi_host_data *hostdata) in ibmvscsi_handle_crq() argument
1759 dev_info(hostdata->dev, "partner initialized\n"); in ibmvscsi_handle_crq()
1761 rc = ibmvscsi_send_crq(hostdata, 0xC002000000000000LL, 0); in ibmvscsi_handle_crq()
1764 init_adapter(hostdata); in ibmvscsi_handle_crq()
1766 dev_err(hostdata->dev, "Unable to send init rsp. rc=%ld\n", rc); in ibmvscsi_handle_crq()
1771 dev_info(hostdata->dev, "partner initialization complete\n"); in ibmvscsi_handle_crq()
1774 init_adapter(hostdata); in ibmvscsi_handle_crq()
1777 dev_err(hostdata->dev, "unknown crq message type: %d\n", crq->format); in ibmvscsi_handle_crq()
1781 scsi_block_requests(hostdata->host); in ibmvscsi_handle_crq()
1782 atomic_set(&hostdata->request_limit, 0); in ibmvscsi_handle_crq()
1785 dev_info(hostdata->dev, "Re-enabling adapter!\n"); in ibmvscsi_handle_crq()
1786 hostdata->client_migrated = 1; in ibmvscsi_handle_crq()
1787 hostdata->action = IBMVSCSI_HOST_ACTION_REENABLE; in ibmvscsi_handle_crq()
1788 purge_requests(hostdata, DID_REQUEUE); in ibmvscsi_handle_crq()
1789 wake_up(&hostdata->work_wait_q); in ibmvscsi_handle_crq()
1791 dev_err(hostdata->dev, "Virtual adapter failed rc %d!\n", in ibmvscsi_handle_crq()
1793 ibmvscsi_reset_host(hostdata); in ibmvscsi_handle_crq()
1799 dev_err(hostdata->dev, "got an invalid message type 0x%02x\n", in ibmvscsi_handle_crq()
1808 if (!valid_event_struct(&hostdata->pool, evt_struct)) { in ibmvscsi_handle_crq()
1809 dev_err(hostdata->dev, "returned correlation_token 0x%p is invalid!\n", in ibmvscsi_handle_crq()
1815 dev_err(hostdata->dev, "received duplicate correlation_token 0x%p!\n", in ibmvscsi_handle_crq()
1822 &hostdata->request_limit); in ibmvscsi_handle_crq()
1831 dev_err(hostdata->dev, "returned done() is NULL; not running it!\n"); in ibmvscsi_handle_crq()
1837 spin_lock_irqsave(evt_struct->hostdata->host->host_lock, flags); in ibmvscsi_handle_crq()
1839 free_event_struct(&evt_struct->hostdata->pool, evt_struct); in ibmvscsi_handle_crq()
1840 spin_unlock_irqrestore(evt_struct->hostdata->host->host_lock, flags); in ibmvscsi_handle_crq()
1888 struct ibmvscsi_host_data *hostdata = shost_priv(shost); in show_host_vhost_loc() local
1891 len = snprintf(buf, sizeof(hostdata->caps.loc), "%s\n", in show_host_vhost_loc()
1892 hostdata->caps.loc); in show_host_vhost_loc()
1908 struct ibmvscsi_host_data *hostdata = shost_priv(shost); in show_host_vhost_name() local
1911 len = snprintf(buf, sizeof(hostdata->caps.name), "%s\n", in show_host_vhost_name()
1912 hostdata->caps.name); in show_host_vhost_name()
1928 struct ibmvscsi_host_data *hostdata = shost_priv(shost); in show_host_srp_version() local
1932 hostdata->madapter_info.srp_version); in show_host_srp_version()
1949 struct ibmvscsi_host_data *hostdata = shost_priv(shost); in show_host_partition_name() local
1953 hostdata->madapter_info.partition_name); in show_host_partition_name()
1970 struct ibmvscsi_host_data *hostdata = shost_priv(shost); in show_host_partition_number() local
1974 be32_to_cpu(hostdata->madapter_info.partition_number)); in show_host_partition_number()
1990 struct ibmvscsi_host_data *hostdata = shost_priv(shost); in show_host_mad_version() local
1994 be32_to_cpu(hostdata->madapter_info.mad_version)); in show_host_mad_version()
2010 struct ibmvscsi_host_data *hostdata = shost_priv(shost); in show_host_os_type() local
2014 be32_to_cpu(hostdata->madapter_info.os_type)); in show_host_os_type()
2042 struct ibmvscsi_host_data *hostdata = shost_priv(shost); in ibmvscsi_host_reset() local
2044 dev_info(hostdata->dev, "Initiating adapter reset!\n"); in ibmvscsi_host_reset()
2045 ibmvscsi_reset_host(hostdata); in ibmvscsi_host_reset()
2104 static void ibmvscsi_do_work(struct ibmvscsi_host_data *hostdata) in ibmvscsi_do_work() argument
2110 spin_lock_irqsave(hostdata->host->host_lock, flags); in ibmvscsi_do_work()
2111 switch (hostdata->action) { in ibmvscsi_do_work()
2116 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_do_work()
2117 rc = ibmvscsi_reset_crq_queue(&hostdata->queue, hostdata); in ibmvscsi_do_work()
2118 spin_lock_irqsave(hostdata->host->host_lock, flags); in ibmvscsi_do_work()
2120 rc = ibmvscsi_send_crq(hostdata, 0xC001000000000000LL, 0); in ibmvscsi_do_work()
2121 vio_enable_interrupts(to_vio_dev(hostdata->dev)); in ibmvscsi_do_work()
2125 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_do_work()
2126 rc = ibmvscsi_reenable_crq_queue(&hostdata->queue, hostdata); in ibmvscsi_do_work()
2127 spin_lock_irqsave(hostdata->host->host_lock, flags); in ibmvscsi_do_work()
2129 rc = ibmvscsi_send_crq(hostdata, 0xC001000000000000LL, 0); in ibmvscsi_do_work()
2133 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_do_work()
2137 hostdata->action = IBMVSCSI_HOST_ACTION_NONE; in ibmvscsi_do_work()
2140 atomic_set(&hostdata->request_limit, -1); in ibmvscsi_do_work()
2141 dev_err(hostdata->dev, "error after %s\n", action); in ibmvscsi_do_work()
2143 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_do_work()
2145 scsi_unblock_requests(hostdata->host); in ibmvscsi_do_work()
2148 static int __ibmvscsi_work_to_do(struct ibmvscsi_host_data *hostdata) in __ibmvscsi_work_to_do() argument
2152 switch (hostdata->action) { in __ibmvscsi_work_to_do()
2165 static int ibmvscsi_work_to_do(struct ibmvscsi_host_data *hostdata) in ibmvscsi_work_to_do() argument
2170 spin_lock_irqsave(hostdata->host->host_lock, flags); in ibmvscsi_work_to_do()
2171 rc = __ibmvscsi_work_to_do(hostdata); in ibmvscsi_work_to_do()
2172 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_work_to_do()
2179 struct ibmvscsi_host_data *hostdata = data; in ibmvscsi_work() local
2185 rc = wait_event_interruptible(hostdata->work_wait_q, in ibmvscsi_work()
2186 ibmvscsi_work_to_do(hostdata)); in ibmvscsi_work()
2193 ibmvscsi_do_work(hostdata); in ibmvscsi_work()
2204 struct ibmvscsi_host_data *hostdata; in ibmvscsi_probe() local
2214 host = scsi_host_alloc(&driver_template, sizeof(*hostdata)); in ibmvscsi_probe()
2221 hostdata = shost_priv(host); in ibmvscsi_probe()
2222 memset(hostdata, 0x00, sizeof(*hostdata)); in ibmvscsi_probe()
2223 INIT_LIST_HEAD(&hostdata->sent); in ibmvscsi_probe()
2224 init_waitqueue_head(&hostdata->work_wait_q); in ibmvscsi_probe()
2225 hostdata->host = host; in ibmvscsi_probe()
2226 hostdata->dev = dev; in ibmvscsi_probe()
2227 atomic_set(&hostdata->request_limit, -1); in ibmvscsi_probe()
2228 hostdata->host->max_sectors = IBMVSCSI_MAX_SECTORS_DEFAULT; in ibmvscsi_probe()
2230 if (map_persist_bufs(hostdata)) { in ibmvscsi_probe()
2235 hostdata->work_thread = kthread_run(ibmvscsi_work, hostdata, "%s_%d", in ibmvscsi_probe()
2238 if (IS_ERR(hostdata->work_thread)) { in ibmvscsi_probe()
2240 PTR_ERR(hostdata->work_thread)); in ibmvscsi_probe()
2244 rc = ibmvscsi_init_crq_queue(&hostdata->queue, hostdata, max_events); in ibmvscsi_probe()
2249 if (initialize_event_pool(&hostdata->pool, max_events, hostdata) != 0) { in ibmvscsi_probe()
2263 if (scsi_add_host(hostdata->host, hostdata->dev)) in ibmvscsi_probe()
2267 memcpy(ids.port_id, hostdata->madapter_info.partition_name, in ibmvscsi_probe()
2278 if (ibmvscsi_send_crq(hostdata, 0xC001000000000000LL, 0) == 0 in ibmvscsi_probe()
2288 atomic_read(&hostdata->request_limit) < 2;) { in ibmvscsi_probe()
2294 if (atomic_read(&hostdata->request_limit) > 0) in ibmvscsi_probe()
2298 dev_set_drvdata(&vdev->dev, hostdata); in ibmvscsi_probe()
2300 list_add_tail(&hostdata->host_list, &ibmvscsi_head); in ibmvscsi_probe()
2305 scsi_remove_host(hostdata->host); in ibmvscsi_probe()
2307 release_event_pool(&hostdata->pool, hostdata); in ibmvscsi_probe()
2309 ibmvscsi_release_crq_queue(&hostdata->queue, hostdata, max_events); in ibmvscsi_probe()
2311 kthread_stop(hostdata->work_thread); in ibmvscsi_probe()
2313 unmap_persist_bufs(hostdata); in ibmvscsi_probe()
2322 struct ibmvscsi_host_data *hostdata = dev_get_drvdata(&vdev->dev); in ibmvscsi_remove() local
2325 srp_remove_host(hostdata->host); in ibmvscsi_remove()
2326 scsi_remove_host(hostdata->host); in ibmvscsi_remove()
2328 purge_requests(hostdata, DID_ERROR); in ibmvscsi_remove()
2330 spin_lock_irqsave(hostdata->host->host_lock, flags); in ibmvscsi_remove()
2331 release_event_pool(&hostdata->pool, hostdata); in ibmvscsi_remove()
2332 spin_unlock_irqrestore(hostdata->host->host_lock, flags); in ibmvscsi_remove()
2334 ibmvscsi_release_crq_queue(&hostdata->queue, hostdata, in ibmvscsi_remove()
2337 kthread_stop(hostdata->work_thread); in ibmvscsi_remove()
2338 unmap_persist_bufs(hostdata); in ibmvscsi_remove()
2341 list_del(&hostdata->host_list); in ibmvscsi_remove()
2344 scsi_host_put(hostdata->host); in ibmvscsi_remove()
2358 struct ibmvscsi_host_data *hostdata = dev_get_drvdata(dev); in ibmvscsi_resume() local
2359 vio_disable_interrupts(to_vio_dev(hostdata->dev)); in ibmvscsi_resume()
2360 tasklet_schedule(&hostdata->srp_task); in ibmvscsi_resume()