Lines Matching +full:out +full:- +full:volume +full:- +full:limit
1 /*-
2 * Copyright 2016-2023 Microchip Technology, Inc. and/or its subsidiaries.
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
40 softs->max_aio_write_raid5_6 = in pqisrc_QuerySenseFeatures()
42 softs->max_aio_write_raid1_10_2drv = in pqisrc_QuerySenseFeatures()
44 softs->max_aio_write_raid1_10_3drv = in pqisrc_QuerySenseFeatures()
46 softs->max_aio_rw_xfer_crypto_nvme = in pqisrc_QuerySenseFeatures()
48 softs->max_aio_rw_xfer_crypto_sas_sata = in pqisrc_QuerySenseFeatures()
52 softs->enable_stream_detection = softs->hint.stream_status; in pqisrc_QuerySenseFeatures()
77 if (features->aio_subpage.header.total_length >= in pqisrc_QuerySenseFeatures()
80 features->aio_subpage.header.total_length); in pqisrc_QuerySenseFeatures()
81 softs->adv_aio_capable = true; in pqisrc_QuerySenseFeatures()
84 * Values of 0 mean 'no limit'. in pqisrc_QuerySenseFeatures()
87 softs->max_aio_write_raid5_6 = in pqisrc_QuerySenseFeatures()
88 (features->aio_subpage.max_aio_write_raid5_6 == 0) ? in pqisrc_QuerySenseFeatures()
90 features->aio_subpage.max_aio_write_raid5_6 * 1024; in pqisrc_QuerySenseFeatures()
91 softs->max_aio_write_raid1_10_2drv = in pqisrc_QuerySenseFeatures()
92 (features->aio_subpage.max_aio_write_raid1_10_2drv in pqisrc_QuerySenseFeatures()
94 features->aio_subpage.max_aio_write_raid1_10_2drv in pqisrc_QuerySenseFeatures()
96 softs->max_aio_write_raid1_10_3drv = in pqisrc_QuerySenseFeatures()
97 (features->aio_subpage.max_aio_write_raid1_10_3drv in pqisrc_QuerySenseFeatures()
99 features->aio_subpage.max_aio_write_raid1_10_3drv in pqisrc_QuerySenseFeatures()
101 softs->max_aio_rw_xfer_crypto_nvme = in pqisrc_QuerySenseFeatures()
102 (features->aio_subpage.max_aio_rw_xfer_crypto_nvme in pqisrc_QuerySenseFeatures()
104 features->aio_subpage.max_aio_rw_xfer_crypto_nvme in pqisrc_QuerySenseFeatures()
106 softs->max_aio_rw_xfer_crypto_sas_sata = in pqisrc_QuerySenseFeatures()
107 (features->aio_subpage.max_aio_rw_xfer_crypto_sas_sata in pqisrc_QuerySenseFeatures()
109 features->aio_subpage.max_aio_rw_xfer_crypto_sas_sata in pqisrc_QuerySenseFeatures()
112 DBG_INIT("softs->max_aio_write_raid5_6: 0x%x\n", in pqisrc_QuerySenseFeatures()
113 softs->max_aio_write_raid5_6); in pqisrc_QuerySenseFeatures()
114 DBG_INIT("softs->max_aio_write_raid1_10_2drv: 0x%x\n", in pqisrc_QuerySenseFeatures()
115 softs->max_aio_write_raid1_10_2drv); in pqisrc_QuerySenseFeatures()
116 DBG_INIT("softs->max_aio_write_raid1_10_3drv: 0x%x\n", in pqisrc_QuerySenseFeatures()
117 softs->max_aio_write_raid1_10_3drv); in pqisrc_QuerySenseFeatures()
118 DBG_INIT("softs->max_aio_rw_xfer_crypto_nvme: 0x%x\n", in pqisrc_QuerySenseFeatures()
119 softs->max_aio_rw_xfer_crypto_nvme); in pqisrc_QuerySenseFeatures()
120 DBG_INIT("softs->max_aio_rw_xfer_crypto_sas_sata: 0x%x\n", in pqisrc_QuerySenseFeatures()
121 softs->max_aio_rw_xfer_crypto_sas_sata); in pqisrc_QuerySenseFeatures()
126 softs->adv_aio_capable = false; in pqisrc_QuerySenseFeatures()
144 memset(&softs->bit_map, SLOT_AVAILABLE, sizeof(softs->bit_map)); in pqisrc_init_bitmap()
155 softs->bit_map.bit_vector[target] = SLOT_AVAILABLE; in pqisrc_remove_target_bit()
165 if(softs->bit_map.bit_vector[avail_target] == SLOT_AVAILABLE){ in pqisrc_find_avail_target()
166 softs->bit_map.bit_vector[avail_target] = SLOT_TAKEN; in pqisrc_find_avail_target()
175 /* Subroutine used to set Bus-Target-Lun for the requested device */
181 device->bus = bus; in pqisrc_set_btl()
182 device->target = target; in pqisrc_set_btl()
183 device->lun = lun; in pqisrc_set_btl()
185 DBG_FUNC("OUT\n"); in pqisrc_set_btl()
189 * devices and multi-lun devices */
217 * If a non-zero lun device, search through the list & find the in pqisrc_add_softs_entry()
221 memcpy(addr1, device->scsi3addr, 8); in pqisrc_add_softs_entry()
223 if(softs->dev_list[j] == NULL) in pqisrc_add_softs_entry()
225 temp_device = softs->dev_list[j]; in pqisrc_add_softs_entry()
226 memcpy(addr2, temp_device->scsi3addr, 8); in pqisrc_add_softs_entry()
229 temp_device->target,device->scsi3addr[0]); in pqisrc_add_softs_entry()
235 pqisrc_set_btl(device, PQI_EXTERNAL_RAID_VOLUME_BUS, tid, device->scsi3addr[0]); in pqisrc_add_softs_entry()
245 /* This is a non-zero lun of a multi-lun device. in pqisrc_add_softs_entry()
250 memcpy(addr1, device->scsi3addr, 8); in pqisrc_add_softs_entry()
254 if(softs->dev_list[j] == NULL) in pqisrc_add_softs_entry()
256 temp_device = softs->dev_list[j]; in pqisrc_add_softs_entry()
257 memcpy(addr2, temp_device->scsi3addr, 8); in pqisrc_add_softs_entry()
261 * then the passed-in device is an additional lun of a in pqisrc_add_softs_entry()
262 * previously added multi-lun device. Use the same target in pqisrc_add_softs_entry()
266 pqisrc_set_btl(device, temp_device->bus, in pqisrc_add_softs_entry()
267 temp_device->target, temp_device->scsi3addr[4]); in pqisrc_add_softs_entry()
272 "B %d: T %d: L %d\n", device->bus, device->target, in pqisrc_add_softs_entry()
273 device->lun ); in pqisrc_add_softs_entry()
278 * softs->dev_list */ in pqisrc_add_softs_entry()
279 softs->num_devs++; in pqisrc_add_softs_entry()
281 if(softs->dev_list[j]) in pqisrc_add_softs_entry()
283 softs->dev_list[j] = device; in pqisrc_add_softs_entry()
287 j, softs->num_devs, device->bus, device->target, in pqisrc_add_softs_entry()
288 device->lun); in pqisrc_add_softs_entry()
302 if(softs->dev_list[index] == NULL) in pqisrc_find_btl_list_index()
304 temp_device = softs->dev_list[index]; in pqisrc_find_btl_list_index()
307 if(bus == softs->bus_id && in pqisrc_find_btl_list_index()
308 target == temp_device->target && in pqisrc_find_btl_list_index()
309 lun == temp_device->lun){ in pqisrc_find_btl_list_index()
314 if ((temp_device->is_physical_device) && (target == temp_device->target) in pqisrc_find_btl_list_index()
315 && (temp_device->is_multi_lun)) { in pqisrc_find_btl_list_index()
331 if(softs->dev_list[index] == NULL) in pqisrc_find_device_list_index()
333 temp_device = softs->dev_list[index]; in pqisrc_find_device_list_index()
336 if(device->bus == temp_device->bus && in pqisrc_find_device_list_index()
337 device->target == temp_device->target in pqisrc_find_device_list_index()
338 && device->lun == temp_device->lun){ in pqisrc_find_device_list_index()
355 softs->dev_list[index] = NULL; in pqisrc_delete_softs_entry()
356 softs->num_devs--; in pqisrc_delete_softs_entry()
358 device->bus, device->target, device->lun, softs->num_devs); in pqisrc_delete_softs_entry()
381 os_strlcpy(device_mem->tag, "device_mem", sizeof(device_mem->tag)); in pqisrc_simple_dma_alloc()
382 device_mem->size = datasize; in pqisrc_simple_dma_alloc()
383 device_mem->align = PQISRC_DEFAULT_DMA_ALIGN; in pqisrc_simple_dma_alloc()
392 ASSERT(device_mem->size == datasize); in pqisrc_simple_dma_alloc()
394 sgd->addr = device_mem->dma_addr; in pqisrc_simple_dma_alloc()
395 sgd->len = datasize; in pqisrc_simple_dma_alloc()
396 sgd->flags = SG_FLAG_LAST; in pqisrc_simple_dma_alloc()
416 ib_queue_t *ib_q = &softs->op_raid_ib_q[PQI_DEFAULT_IB_QUEUE]; in pqisrc_build_send_raid_request()
417 ob_queue_t *ob_q = &softs->op_ob_q[PQI_DEFAULT_IB_QUEUE]; in pqisrc_build_send_raid_request()
422 request->header.iu_type = PQI_IU_TYPE_RAID_PATH_IO_REQUEST; in pqisrc_build_send_raid_request()
424 request->header.iu_length = LE_16(offsetof(pqisrc_raid_req_t, in pqisrc_build_send_raid_request()
425 sg_descriptors[1]) - PQI_REQUEST_HEADER_LENGTH); in pqisrc_build_send_raid_request()
426 request->buffer_length = LE_32(datasize); in pqisrc_build_send_raid_request()
427 memcpy(request->lun_number, scsi3addr, sizeof(request->lun_number)); in pqisrc_build_send_raid_request()
428 request->task_attribute = SOP_TASK_ATTRIBUTE_SIMPLE; in pqisrc_build_send_raid_request()
429 request->additional_cdb_bytes_usage = PQI_ADDITIONAL_CDB_BYTES_0; in pqisrc_build_send_raid_request()
431 tag = pqisrc_get_tag(&softs->taglist); in pqisrc_build_send_raid_request()
438 ((pqisrc_raid_req_t *)request)->request_id = tag; in pqisrc_build_send_raid_request()
439 ((pqisrc_raid_req_t *)request)->error_index = ((pqisrc_raid_req_t *)request)->request_id; in pqisrc_build_send_raid_request()
440 ((pqisrc_raid_req_t *)request)->response_queue_id = ob_q->q_id; in pqisrc_build_send_raid_request()
441 rcb = &softs->rcb[tag]; in pqisrc_build_send_raid_request()
442 rcb->success_cmp_callback = pqisrc_process_internal_raid_response_success; in pqisrc_build_send_raid_request()
443 rcb->error_cmp_callback = pqisrc_process_internal_raid_response_error; in pqisrc_build_send_raid_request()
445 rcb->req_pending = true; in pqisrc_build_send_raid_request()
446 rcb->tag = tag; in pqisrc_build_send_raid_request()
457 DBG_ERR("Internal RAID request timed out: cmd : 0x%c\n", cmd); in pqisrc_build_send_raid_request()
468 ret = rcb->status; in pqisrc_build_send_raid_request()
472 rcb->error_info, in pqisrc_build_send_raid_request()
475 if (error_info->data_out_result == in pqisrc_build_send_raid_request()
495 pqisrc_put_tag(&softs->taglist, ((pqisrc_raid_req_t *)request)->request_id); in pqisrc_build_send_raid_request()
496 DBG_FUNC("OUT\n"); in pqisrc_build_send_raid_request()
504 pqisrc_put_tag(&softs->taglist, ((pqisrc_raid_req_t *)request)->request_id); in pqisrc_build_send_raid_request()
520 uint8_t cmd = IS_BMIC_OPCODE(request->cmd.cdb[0]) ? request->cmd.cdb[6] : request->cmd.cdb[0]; in pqisrc_prepare_send_raid()
522 ret = pqisrc_simple_dma_alloc(softs, &device_mem, datasize, request->sg_descriptors); in pqisrc_prepare_send_raid()
528 /* If we are sending out data, copy it over to dma buf */ in pqisrc_prepare_send_raid()
529 if (datasize && buff && request->data_direction == SOP_DATA_DIR_FROM_DEVICE) in pqisrc_prepare_send_raid()
584 DBG_FUNC("OUT\n"); in pqisrc_report_luns()
626 goto out; in pqisrc_get_physical_logical_luns()
636 new_lun_list_length = BE_32(lun_data->header.list_length); in pqisrc_get_physical_logical_luns()
644 out: in pqisrc_get_physical_logical_luns()
646 DBG_FUNC("OUT\n"); in pqisrc_get_physical_logical_luns()
692 goto out; in pqisrc_get_queue_lun_list()
700 new_lun_list_length = BE_32(lun_data->header.list_length); in pqisrc_get_queue_lun_list()
708 out: in pqisrc_get_queue_lun_list()
710 DBG_FUNC("OUT\n"); in pqisrc_get_queue_lun_list()
755 if(softs->log_dev_data_length != *log_data_length) { in pqisrc_get_phys_log_device_list()
756 if(softs->log_dev_list) in pqisrc_get_phys_log_device_list()
757 os_mem_free(softs, softs->log_dev_list, softs->log_dev_data_length); in pqisrc_get_phys_log_device_list()
758 softs->log_dev_list = os_mem_alloc(softs, *log_data_length); in pqisrc_get_phys_log_device_list()
760 memcpy(softs->log_dev_list, *logical_dev_list, *log_data_length); in pqisrc_get_phys_log_device_list()
761 softs->log_dev_data_length = *log_data_length; in pqisrc_get_phys_log_device_list()
774 BE_32(logdev_data->header.list_length); in pqisrc_get_phys_log_device_list()
798 local_logdev_list->header.list_length = BE_32(logical_list_length + in pqisrc_get_phys_log_device_list()
805 DBG_FUNC("OUT\n"); in pqisrc_get_phys_log_device_list()
813 return device->is_external_raid_device; in pqisrc_is_external_raid_device()
822 /* Function used to assign Bus-Target-Lun for the requested device */
833 scsi3addr = device->scsi3addr; in pqisrc_assign_btl()
839 device->target_lun_valid = true; in pqisrc_assign_btl()
843 /* When the specified device is a logical volume, in pqisrc_assign_btl()
851 device->target_lun_valid = true; in pqisrc_assign_btl()
855 DBG_FUNC("OUT\n"); in pqisrc_assign_btl()
880 if (softs->timeout_in_passthrough) { in pqisrc_send_scsi_inquiry()
886 DBG_FUNC("OUT\n"); in pqisrc_send_scsi_inquiry()
890 /* Determine logical volume status from vpd buffer.*/
905 goto out; in pqisrc_get_dev_vol_status()
908 ret = pqisrc_send_scsi_inquiry(softs, device->scsi3addr, VPD_PAGE | SA_VPD_LV_STATUS, in pqisrc_get_dev_vol_status()
913 goto out; in pqisrc_get_dev_vol_status()
916 if (vpd->page_code != SA_VPD_LV_STATUS) { in pqisrc_get_dev_vol_status()
918 goto out; in pqisrc_get_dev_vol_status()
921 page_length = offsetof(vpd_volume_status, volume_status) + vpd->page_length; in pqisrc_get_dev_vol_status()
923 goto out; in pqisrc_get_dev_vol_status()
925 status = vpd->volume_status; in pqisrc_get_dev_vol_status()
926 offline = (vpd->flags & SA_LV_FLAGS_NO_HOST_IO)!=0; in pqisrc_get_dev_vol_status()
928 out: in pqisrc_get_dev_vol_status()
929 device->volume_offline = offline; in pqisrc_get_dev_vol_status()
930 device->volume_status = status; in pqisrc_get_dev_vol_status()
934 DBG_FUNC("OUT\n"); in pqisrc_get_dev_vol_status()
952 raidmap_size = LE_32(raid_map->structure_size); in pqisrc_raid_map_validation()
959 phys_dev_num = LE_16(raid_map->layout_map_count) * in pqisrc_raid_map_validation()
960 (LE_16(raid_map->data_disks_per_row) + in pqisrc_raid_map_validation()
961 LE_16(raid_map->metadata_disks_per_row)); in pqisrc_raid_map_validation()
964 if (device->raid_level == SA_RAID_1) { in pqisrc_raid_map_validation()
965 if (LE_16(raid_map->layout_map_count) != 2) { in pqisrc_raid_map_validation()
966 error_msg = "invalid RAID-1 map\n"; in pqisrc_raid_map_validation()
969 } else if (device->raid_level == SA_RAID_ADM) { in pqisrc_raid_map_validation()
970 if (LE_16(raid_map->layout_map_count) != 3) { in pqisrc_raid_map_validation()
971 error_msg = "invalid RAID-1(triple) map\n"; in pqisrc_raid_map_validation()
974 } else if ((device->raid_level == SA_RAID_5 || in pqisrc_raid_map_validation()
975 device->raid_level == SA_RAID_6) && in pqisrc_raid_map_validation()
976 LE_16(raid_map->layout_map_count) > 1) { in pqisrc_raid_map_validation()
979 LE_16(raid_map->strip_size) * in pqisrc_raid_map_validation()
980 LE_16(raid_map->data_disks_per_row); in pqisrc_raid_map_validation()
982 error_msg = "invalid RAID-5 or RAID-6 map\n"; in pqisrc_raid_map_validation()
987 DBG_FUNC("OUT\n"); in pqisrc_raid_map_validation()
1025 …ret = pqisrc_prepare_send_raid(softs, &request, raid_map, raidmap_alloc_size, device->scsi3addr, N… in pqisrc_get_device_raidmap()
1032 raidmap_reported_size = LE_32(raid_map->structure_size); in pqisrc_get_device_raidmap()
1048 structure_size = raid_map->data_disks_per_row * sizeof(*next_offload_to_mirror); in pqisrc_get_device_raidmap()
1055 device->raid_map = raid_map; in pqisrc_get_device_raidmap()
1056 device->offload_to_mirror = next_offload_to_mirror; in pqisrc_get_device_raidmap()
1057 DBG_FUNC("OUT\n"); in pqisrc_get_device_raidmap()
1081 ret = pqisrc_send_scsi_inquiry(softs, device->scsi3addr, in pqisrc_get_dev_ioaccel_status()
1089 device->offload_config = in pqisrc_get_dev_ioaccel_status()
1092 if (device->offload_config) { in pqisrc_get_dev_ioaccel_status()
1093 device->offload_enabled_pending = in pqisrc_get_dev_ioaccel_status()
1096 device->offload_enabled_pending = false; in pqisrc_get_dev_ioaccel_status()
1100 device->offload_config, device->offload_enabled_pending); in pqisrc_get_dev_ioaccel_status()
1104 DBG_FUNC("OUT\n"); in pqisrc_get_dev_ioaccel_status()
1121 ret = pqisrc_send_scsi_inquiry(softs, device->scsi3addr, in pqisrc_get_dev_raid_level()
1131 device->raid_level = raid_level; in pqisrc_get_dev_raid_level()
1133 DBG_FUNC("OUT\n"); in pqisrc_get_dev_raid_level()
1150 while(retry--) { in pqisrc_get_dev_data()
1152 ret = pqisrc_send_scsi_inquiry(softs, device->scsi3addr, 0, inq_buff, in pqisrc_get_dev_data()
1163 device->devtype = inq_buff[0] & 0x1f; in pqisrc_get_dev_data()
1164 memcpy(device->vendor, &inq_buff[8], in pqisrc_get_dev_data()
1165 sizeof(device->vendor)); in pqisrc_get_dev_data()
1166 memcpy(device->model, &inq_buff[16], in pqisrc_get_dev_data()
1167 sizeof(device->model)); in pqisrc_get_dev_data()
1168 …DBG_DISC("DEV_TYPE: %x VENDOR: %.8s MODEL: %.16s\n", device->devtype, device->vendor, device->mod… in pqisrc_get_dev_data()
1170 if (pqisrc_is_logical_device(device) && device->devtype == DISK_DEVICE) { in pqisrc_get_dev_data()
1172 device->raid_level = SA_RAID_UNKNOWN; in pqisrc_get_dev_data()
1173 device->volume_status = SA_LV_OK; in pqisrc_get_dev_data()
1174 device->volume_offline = false; in pqisrc_get_dev_data()
1184 * Check if this is a One-Button-Disaster-Recovery device in pqisrc_get_dev_data()
1185 * by looking for "$DR-10" at offset 43 in the inquiry data. in pqisrc_get_dev_data()
1187 device->is_obdr_device = (device->devtype == ROM_DEVICE && in pqisrc_get_dev_data()
1193 DBG_FUNC("OUT\n"); in pqisrc_get_dev_data()
1218 DBG_FUNC("OUT\n"); in pqisrc_identify_ctrl()
1242 goto out; in pqisrc_get_ctrl_fw_version()
1244 softs->fw_build_number = identify_ctrl->fw_build_number; in pqisrc_get_ctrl_fw_version()
1245 memcpy(softs->fw_version, identify_ctrl->fw_version, in pqisrc_get_ctrl_fw_version()
1246 sizeof(identify_ctrl->fw_version)); in pqisrc_get_ctrl_fw_version()
1247 softs->fw_version[sizeof(identify_ctrl->fw_version)] = '\0'; in pqisrc_get_ctrl_fw_version()
1248 snprintf(softs->fw_version + in pqisrc_get_ctrl_fw_version()
1249 strlen(softs->fw_version), in pqisrc_get_ctrl_fw_version()
1250 sizeof(softs->fw_version), in pqisrc_get_ctrl_fw_version()
1251 "-%u", identify_ctrl->fw_build_number); in pqisrc_get_ctrl_fw_version()
1252 out: in pqisrc_get_ctrl_fw_version()
1254 …DBG_NOTE("Firmware version: %s Firmware build number: %d\n", softs->fw_version, softs->fw_build_nu… in pqisrc_get_ctrl_fw_version()
1255 DBG_FUNC("OUT\n"); in pqisrc_get_ctrl_fw_version()
1274 bmic_device_index = BMIC_GET_DRIVE_NUMBER(device->scsi3addr); in pqisrc_identify_physical_disk()
1285 DBG_FUNC("OUT\n"); in pqisrc_identify_physical_disk()
1306 device->queue_depth = PQI_PHYSICAL_DISK_DEFAULT_MAX_QUEUE_DEPTH; in pqisrc_get_physical_device_info()
1310 device->queue_depth = in pqisrc_get_physical_device_info()
1311 LE_16(id_phys->current_queue_depth_limit); in pqisrc_get_physical_device_info()
1312 device->device_type = id_phys->device_type; in pqisrc_get_physical_device_info()
1313 device->active_path_index = id_phys->active_path_number; in pqisrc_get_physical_device_info()
1314 device->path_map = id_phys->redundant_path_present_map; in pqisrc_get_physical_device_info()
1315 memcpy(&device->box, in pqisrc_get_physical_device_info()
1316 &id_phys->alternate_paths_phys_box_on_port, in pqisrc_get_physical_device_info()
1317 sizeof(device->box)); in pqisrc_get_physical_device_info()
1318 memcpy(&device->phys_connector, in pqisrc_get_physical_device_info()
1319 &id_phys->alternate_paths_phys_connector, in pqisrc_get_physical_device_info()
1320 sizeof(device->phys_connector)); in pqisrc_get_physical_device_info()
1321 device->bay = id_phys->phys_bay_in_box; in pqisrc_get_physical_device_info()
1322 if (id_phys->multi_lun_device_lun_count) { in pqisrc_get_physical_device_info()
1323 device->is_multi_lun = true; in pqisrc_get_physical_device_info()
1326 DBG_DISC("BMIC DEV_TYPE: %x QUEUE DEPTH: 0x%x \n", device->device_type, device->queue_depth); in pqisrc_get_physical_device_info()
1327 DBG_FUNC("OUT\n"); in pqisrc_get_physical_device_info()
1340 device = softs->dev_list[i]; in pqisrc_scsi_find_entry()
1343 if (pqisrc_scsi3addr_equal(device_to_find->scsi3addr, in pqisrc_scsi_find_entry()
1344 device->scsi3addr)) { in pqisrc_scsi_find_entry()
1346 if (device->in_remove == true) in pqisrc_scsi_find_entry()
1349 if (device_to_find->volume_offline) in pqisrc_scsi_find_entry()
1356 DBG_FUNC("OUT\n"); in pqisrc_scsi_find_entry()
1368 device_exist->expose_device = new_device->expose_device; in pqisrc_exist_device_update()
1369 memcpy(device_exist->vendor, new_device->vendor, in pqisrc_exist_device_update()
1370 sizeof(device_exist->vendor)); in pqisrc_exist_device_update()
1371 memcpy(device_exist->model, new_device->model, in pqisrc_exist_device_update()
1372 sizeof(device_exist->model)); in pqisrc_exist_device_update()
1373 device_exist->is_physical_device = new_device->is_physical_device; in pqisrc_exist_device_update()
1374 device_exist->is_external_raid_device = in pqisrc_exist_device_update()
1375 new_device->is_external_raid_device; in pqisrc_exist_device_update()
1379 if ((softs->ld_rescan) && (pqisrc_is_logical_device(device_exist))) { in pqisrc_exist_device_update()
1380 device_exist->scsi_rescan = true; in pqisrc_exist_device_update()
1383 device_exist->sas_address = new_device->sas_address; in pqisrc_exist_device_update()
1384 device_exist->raid_level = new_device->raid_level; in pqisrc_exist_device_update()
1385 device_exist->queue_depth = new_device->queue_depth; in pqisrc_exist_device_update()
1386 device_exist->ioaccel_handle = new_device->ioaccel_handle; in pqisrc_exist_device_update()
1387 device_exist->volume_status = new_device->volume_status; in pqisrc_exist_device_update()
1388 device_exist->active_path_index = new_device->active_path_index; in pqisrc_exist_device_update()
1389 device_exist->path_map = new_device->path_map; in pqisrc_exist_device_update()
1390 device_exist->bay = new_device->bay; in pqisrc_exist_device_update()
1391 memcpy(device_exist->box, new_device->box, in pqisrc_exist_device_update()
1392 sizeof(device_exist->box)); in pqisrc_exist_device_update()
1393 memcpy(device_exist->phys_connector, new_device->phys_connector, in pqisrc_exist_device_update()
1394 sizeof(device_exist->phys_connector)); in pqisrc_exist_device_update()
1395 device_exist->offload_config = new_device->offload_config; in pqisrc_exist_device_update()
1396 device_exist->offload_enabled_pending = in pqisrc_exist_device_update()
1397 new_device->offload_enabled_pending; in pqisrc_exist_device_update()
1398 if (device_exist->offload_to_mirror) in pqisrc_exist_device_update()
1400 (int *) device_exist->offload_to_mirror, in pqisrc_exist_device_update()
1401 sizeof(*(device_exist->offload_to_mirror))); in pqisrc_exist_device_update()
1402 device_exist->offload_to_mirror = new_device->offload_to_mirror; in pqisrc_exist_device_update()
1403 if (device_exist->raid_map) in pqisrc_exist_device_update()
1405 (char *)device_exist->raid_map, in pqisrc_exist_device_update()
1406 sizeof(*device_exist->raid_map)); in pqisrc_exist_device_update()
1407 device_exist->raid_map = new_device->raid_map; in pqisrc_exist_device_update()
1409 new_device->raid_map = NULL; in pqisrc_exist_device_update()
1410 new_device->offload_to_mirror = NULL; in pqisrc_exist_device_update()
1411 DBG_FUNC("OUT\n"); in pqisrc_exist_device_update()
1420 …ce->vendor, device->model, device->bus, device->target, device->lun, device->is_physical_device, d… in pqisrc_add_device()
1422 device->invalid = false; in pqisrc_add_device()
1423 device->schedule_rescan = false; in pqisrc_add_device()
1424 device->softs = softs; in pqisrc_add_device()
1425 device->in_remove = false; in pqisrc_add_device()
1427 if(device->expose_device) { in pqisrc_add_device()
1432 DBG_FUNC("OUT\n"); in pqisrc_add_device()
1443 …ce->vendor, device->model, device->bus, device->target, device->lun, device->is_physical_device, d… in pqisrc_remove_device()
1444 device->invalid = true; in pqisrc_remove_device()
1445 if (device->expose_device == false) { in pqisrc_remove_device()
1451 /* softs->device_list[device->target][device->lun] = NULL; */ in pqisrc_remove_device()
1459 DBG_FUNC("OUT\n"); in pqisrc_remove_device()
1480 OS_ACQUIRE_SPINLOCK(&softs->devlist_lock); in pqisrc_adjust_list()
1486 memcpy(addr1, device->scsi3addr, 8); in pqisrc_adjust_list()
1488 if(softs->dev_list[i] == NULL) in pqisrc_adjust_list()
1490 temp_device = softs->dev_list[i]; in pqisrc_adjust_list()
1491 memcpy(addr2, temp_device->scsi3addr, 8); in pqisrc_adjust_list()
1500 pqisrc_remove_target_bit(softs, device->target); in pqisrc_adjust_list()
1505 scsi3addr = device->scsi3addr; in pqisrc_adjust_list()
1507 DBG_NOTE("About to remove target bit %d \n", device->target); in pqisrc_adjust_list()
1508 pqisrc_remove_target_bit(softs, device->target); in pqisrc_adjust_list()
1511 OS_RELEASE_SPINLOCK(&softs->devlist_lock); in pqisrc_adjust_list()
1514 DBG_FUNC("OUT\n"); in pqisrc_adjust_list()
1517 /* Debug routine used to display the RAID volume status of the device */
1524 switch (device->volume_status) { in pqisrc_display_volume_status()
1526 status = "Volume is online."; in pqisrc_display_volume_status()
1529 status = "Volume is undergoing background erase process."; in pqisrc_display_volume_status()
1532 status = "Volume is waiting for transforming volume."; in pqisrc_display_volume_status()
1535 status = "Volume is undergoing rapid parity initialization process."; in pqisrc_display_volume_status()
1538 status = "Volume is queued for rapid parity initialization process."; in pqisrc_display_volume_status()
1541 status = "Volume is encrypted and cannot be accessed because key is not present."; in pqisrc_display_volume_status()
1544 …status = "Volume is not encrypted and cannot be accessed because controller is in encryption-only … in pqisrc_display_volume_status()
1547 status = "Volume is undergoing encryption process."; in pqisrc_display_volume_status()
1550 status = "Volume is undergoing encryption re-keying process."; in pqisrc_display_volume_status()
1553 …status = "Volume is encrypted and cannot be accessed because controller does not have encryption e… in pqisrc_display_volume_status()
1556 status = "Volume is pending migration to encrypted state, but process has not started."; in pqisrc_display_volume_status()
1559 status = "Volume is encrypted and is pending encryption rekeying."; in pqisrc_display_volume_status()
1562 status = "Volume status is not available through vital product data pages."; in pqisrc_display_volume_status()
1565 status = "Volume undergoing expansion"; in pqisrc_display_volume_status()
1568 status = "Volume queued for expansion"; in pqisrc_display_volume_status()
1571 status = "Volume ejected"; in pqisrc_display_volume_status()
1574 status = "Volume has wrong physical drive replaced"; in pqisrc_display_volume_status()
1577 status = "Volume disabled scsi id conflict"; in pqisrc_display_volume_status()
1580 status = "Volume hardware has over heated"; in pqisrc_display_volume_status()
1583 status = "Volume hardware over heating"; in pqisrc_display_volume_status()
1586 status = "Volume physical drive connection problem"; in pqisrc_display_volume_status()
1589 status = "Volume is in an unknown state."; in pqisrc_display_volume_status()
1594 device->bus, device->target, device->lun, status); in pqisrc_display_volume_status()
1595 DBG_FUNC("OUT\n"); in pqisrc_display_volume_status()
1604 if (device->raid_map) { in pqisrc_device_mem_free()
1605 os_mem_free(softs, (char *)device->raid_map, sizeof(pqisrc_raid_map_t)); in pqisrc_device_mem_free()
1607 if (device->offload_to_mirror) { in pqisrc_device_mem_free()
1608 os_mem_free(softs, (int *)device->offload_to_mirror, sizeof(*(device->offload_to_mirror))); in pqisrc_device_mem_free()
1611 DBG_FUNC("OUT\n"); in pqisrc_device_mem_free()
1627 for(i = 1; i <= softs->max_outstanding_io; i++) in pqisrc_free_device()
1629 rcb = &softs->rcb[i]; in pqisrc_free_device()
1630 if(rcb->dvp == device) { in pqisrc_free_device()
1632 rcb->dvp = NULL; in pqisrc_free_device()
1635 /* Find the entry in device list for the freed device softs->dev_list[i]& in pqisrc_free_device()
1640 OS_ACQUIRE_SPINLOCK(&softs->devlist_lock); in pqisrc_free_device()
1641 scsi3addr = device->scsi3addr; in pqisrc_free_device()
1643 DBG_NOTE("Giving back target %i \n", device->target); in pqisrc_free_device()
1644 pqisrc_remove_target_bit(softs, device->target); in pqisrc_free_device()
1650 memcpy(addr1, device->scsi3addr, 8); in pqisrc_free_device()
1652 if(softs->dev_list[i] == NULL) in pqisrc_free_device()
1654 temp_device = softs->dev_list[i]; in pqisrc_free_device()
1655 memcpy(addr2, temp_device->scsi3addr, 8); in pqisrc_free_device()
1664 pqisrc_remove_target_bit(softs, device->target); in pqisrc_free_device()
1669 softs->dev_list[index] = NULL; in pqisrc_free_device()
1670 if (device->expose_device == true){ in pqisrc_free_device()
1673 device->bus, device->target, device->lun); in pqisrc_free_device()
1674 OS_RELEASE_SPINLOCK(&softs->devlist_lock); in pqisrc_free_device()
1677 OS_RELEASE_SPINLOCK(&softs->devlist_lock); in pqisrc_free_device()
1703 DBG_WARN("Out of memory \n"); in pqisrc_update_device_list()
1707 OS_ACQUIRE_SPINLOCK(&softs->devlist_lock); in pqisrc_update_device_list()
1710 if(softs->dev_list[i] == NULL) in pqisrc_update_device_list()
1712 device = softs->dev_list[i]; in pqisrc_update_device_list()
1713 device->device_gone = true; in pqisrc_update_device_list()
1727 device->new_device = false; in pqisrc_update_device_list()
1728 same_device->device_gone = false; in pqisrc_update_device_list()
1733 device->new_device = true; in pqisrc_update_device_list()
1737 device->new_device = true; in pqisrc_update_device_list()
1744 device->new_device = false; in pqisrc_update_device_list()
1745 same_device->schedule_rescan = true; in pqisrc_update_device_list()
1754 device = softs->dev_list[i]; in pqisrc_update_device_list()
1757 if (device->device_gone) { in pqisrc_update_device_list()
1758 if(device->in_remove == true) in pqisrc_update_device_list()
1762 device->in_remove = true; in pqisrc_update_device_list()
1764 softs->num_devs--; in pqisrc_update_device_list()
1772 if (!device->new_device) in pqisrc_update_device_list()
1774 if (device->volume_offline) in pqisrc_update_device_list()
1777 /* Find out which devices to add to the driver list in pqisrc_update_device_list()
1778 * in softs->dev_list */ in pqisrc_update_device_list()
1779 scsi3addr = device->scsi3addr; in pqisrc_update_device_list()
1780 if (device->expose_device || !MASKED_DEVICE(scsi3addr)){ in pqisrc_update_device_list()
1792 device = softs->dev_list[i]; in pqisrc_update_device_list()
1795 if (device->offload_enabled != device->offload_enabled_pending) in pqisrc_update_device_list()
1798 device->bus, device->target, device->lun, in pqisrc_update_device_list()
1799 device->offload_enabled_pending, in pqisrc_update_device_list()
1800 device->offload_enabled); in pqisrc_update_device_list()
1802 device->offload_enabled = device->offload_enabled_pending; in pqisrc_update_device_list()
1805 OS_RELEASE_SPINLOCK(&softs->devlist_lock); in pqisrc_update_device_list()
1815 OS_ACQUIRE_SPINLOCK(&softs->devlist_lock); in pqisrc_update_device_list()
1818 if(softs->dev_list[i] == NULL) in pqisrc_update_device_list()
1820 device = softs->dev_list[i]; in pqisrc_update_device_list()
1821 if (device->in_remove) in pqisrc_update_device_list()
1826 * which is 0. That means there is no limit to the in pqisrc_update_device_list()
1831 device->firmware_queue_depth_set == false) in pqisrc_update_device_list()
1832 device->queue_depth = PQI_LOGICAL_DISK_DEFAULT_MAX_QUEUE_DEPTH; in pqisrc_update_device_list()
1834 if (device->scsi_rescan) { in pqisrc_update_device_list()
1838 softs->ld_rescan = false; in pqisrc_update_device_list()
1840 OS_RELEASE_SPINLOCK(&softs->devlist_lock); in pqisrc_update_device_list()
1844 if (device->expose_device) { in pqisrc_update_device_list()
1848 device->bus, device->target, device->lun); in pqisrc_update_device_list()
1862 if (!device->new_device) in pqisrc_update_device_list()
1864 if (device->volume_offline) { in pqisrc_update_device_list()
1871 device = softs->dev_list[i]; in pqisrc_update_device_list()
1875 i, device->bus, device->target, in pqisrc_update_device_list()
1876 device->lun); in pqisrc_update_device_list()
1887 DBG_FUNC("OUT\n"); in pqisrc_update_device_list()
1913 host_wellness_driver_ver->start_tag[0] = '<'; in pqisrc_write_driver_version_to_host_wellness()
1914 host_wellness_driver_ver->start_tag[1] = 'H'; in pqisrc_write_driver_version_to_host_wellness()
1915 host_wellness_driver_ver->start_tag[2] = 'W'; in pqisrc_write_driver_version_to_host_wellness()
1916 host_wellness_driver_ver->start_tag[3] = '>'; in pqisrc_write_driver_version_to_host_wellness()
1917 host_wellness_driver_ver->driver_version_tag[0] = 'D'; in pqisrc_write_driver_version_to_host_wellness()
1918 host_wellness_driver_ver->driver_version_tag[1] = 'V'; in pqisrc_write_driver_version_to_host_wellness()
1919 …host_wellness_driver_ver->driver_version_length = LE_16(sizeof(host_wellness_driver_ver->driver_ve… in pqisrc_write_driver_version_to_host_wellness()
1920 strncpy(host_wellness_driver_ver->driver_version, softs->os_name, in pqisrc_write_driver_version_to_host_wellness()
1921 sizeof(host_wellness_driver_ver->driver_version)); in pqisrc_write_driver_version_to_host_wellness()
1922 if (strlen(softs->os_name) < sizeof(host_wellness_driver_ver->driver_version) ) { in pqisrc_write_driver_version_to_host_wellness()
1923 … strncpy(host_wellness_driver_ver->driver_version + strlen(softs->os_name), PQISRC_DRIVER_VERSION, in pqisrc_write_driver_version_to_host_wellness()
1924 sizeof(host_wellness_driver_ver->driver_version) - strlen(softs->os_name)); in pqisrc_write_driver_version_to_host_wellness()
1927 (unsigned int)strlen(softs->os_name)); in pqisrc_write_driver_version_to_host_wellness()
1930 …host_wellness_driver_ver->driver_version[sizeof(host_wellness_driver_ver->driver_version) - 1] = '… in pqisrc_write_driver_version_to_host_wellness()
1931 host_wellness_driver_ver->end_tag[0] = 'Z'; in pqisrc_write_driver_version_to_host_wellness()
1932 host_wellness_driver_ver->end_tag[1] = 'Z'; in pqisrc_write_driver_version_to_host_wellness()
1944 DBG_FUNC("OUT"); in pqisrc_write_driver_version_to_host_wellness()
1971 host_wellness_time->start_tag[0] = '<'; in pqisrc_write_current_time_to_host_wellness()
1972 host_wellness_time->start_tag[1] = 'H'; in pqisrc_write_current_time_to_host_wellness()
1973 host_wellness_time->start_tag[2] = 'W'; in pqisrc_write_current_time_to_host_wellness()
1974 host_wellness_time->start_tag[3] = '>'; in pqisrc_write_current_time_to_host_wellness()
1975 host_wellness_time->time_tag[0] = 'T'; in pqisrc_write_current_time_to_host_wellness()
1976 host_wellness_time->time_tag[1] = 'D'; in pqisrc_write_current_time_to_host_wellness()
1977 host_wellness_time->time_length = LE_16(offsetof(struct bmic_host_wellness_time, time_length) - in pqisrc_write_current_time_to_host_wellness()
1982 host_wellness_time->dont_write_tag[0] = 'D'; in pqisrc_write_current_time_to_host_wellness()
1983 host_wellness_time->dont_write_tag[1] = 'W'; in pqisrc_write_current_time_to_host_wellness()
1984 host_wellness_time->end_tag[0] = 'Z'; in pqisrc_write_current_time_to_host_wellness()
1985 host_wellness_time->end_tag[1] = 'Z'; in pqisrc_write_current_time_to_host_wellness()
1997 DBG_FUNC("OUT"); in pqisrc_write_current_time_to_host_wellness()
2005 memcpy(&device->wwid, &bmic_phy_info->padding[79], sizeof(device->wwid)); in pqisrc_get_device_vpd_info()
2006 DBG_FUNC("OUT\n"); in pqisrc_get_device_vpd_info()
2049 physical_cnt = BE_32(physical_dev_list->header.list_length) in pqisrc_scan_devices()
2050 / sizeof(physical_dev_list->lun_entries[0]); in pqisrc_scan_devices()
2052 logical_cnt = BE_32(logical_dev_list->header.list_length) in pqisrc_scan_devices()
2053 / sizeof(logical_dev_list->lun_entries[0]); in pqisrc_scan_devices()
2055 logical_queue_cnt = BE_32(logical_queue_dev_list->header.list_length) in pqisrc_scan_devices()
2056 / sizeof(logical_queue_dev_list->lun_entries[0]); in pqisrc_scan_devices()
2096 lun_ext_entry = &physical_dev_list->lun_entries[i]; in pqisrc_scan_devices()
2100 &logical_dev_list->lun_entries[i - physical_cnt]; in pqisrc_scan_devices()
2103 scsi3addr = lun_ext_entry->lunid; in pqisrc_scan_devices()
2106 if(lun_ext_entry->device_type == CONTROLLER_DEVICE) { in pqisrc_scan_devices()
2110 int target = lun_ext_entry->lunid[3] & 0x3f; in pqisrc_scan_devices()
2111 softs->target_sas_addr[target] = BE_64(lun_ext_entry->wwid); in pqisrc_scan_devices()
2114 /* Skip masked physical non-disk devices. */ in pqisrc_scan_devices()
2116 && (lun_ext_entry->ioaccel_handle == 0)) in pqisrc_scan_devices()
2121 memcpy(device->scsi3addr, scsi3addr, sizeof(device->scsi3addr)); in pqisrc_scan_devices()
2122 device->wwid = lun_ext_entry->wwid; in pqisrc_scan_devices()
2123 device->is_physical_device = is_physical_device; in pqisrc_scan_devices()
2124 if (!is_physical_device && logical_queue_cnt--) { in pqisrc_scan_devices()
2125 device->is_external_raid_device = in pqisrc_scan_devices()
2131 multiplier = logical_queue_dev_list->lun_entries[i - physical_cnt].multiplier; in pqisrc_scan_devices()
2132 qdepth = logical_queue_dev_list->lun_entries[i - physical_cnt].queue_depth; in pqisrc_scan_devices()
2134 device->firmware_queue_depth_set = true; in pqisrc_scan_devices()
2135 device->queue_depth = qdepth*256; in pqisrc_scan_devices()
2137 device->firmware_queue_depth_set = true; in pqisrc_scan_devices()
2138 device->queue_depth = qdepth*16; in pqisrc_scan_devices()
2140 if (device->queue_depth > softs->adapterQDepth) { in pqisrc_scan_devices()
2141 device->firmware_queue_depth_set = true; in pqisrc_scan_devices()
2142 device->queue_depth = softs->adapterQDepth; in pqisrc_scan_devices()
2146 device->firmware_queue_depth_set = false; in pqisrc_scan_devices()
2149 device->firmware_queue_depth_set = false; in pqisrc_scan_devices()
2158 (unsigned long long)BE_64(device->scsi3addr[0])); in pqisrc_scan_devices()
2164 if (device->devtype == RAID_DEVICE) { in pqisrc_scan_devices()
2165 device->firmware_queue_depth_set = true; in pqisrc_scan_devices()
2166 device->queue_depth = softs->adapterQDepth; in pqisrc_scan_devices()
2174 if (device->is_physical_device && in pqisrc_scan_devices()
2176 device->expose_device = false; in pqisrc_scan_devices()
2178 device->expose_device = true; in pqisrc_scan_devices()
2180 if (device->is_physical_device && in pqisrc_scan_devices()
2181 (lun_ext_entry->device_flags & in pqisrc_scan_devices()
2183 lun_ext_entry->ioaccel_handle) { in pqisrc_scan_devices()
2184 device->aio_enabled = true; in pqisrc_scan_devices()
2186 switch (device->devtype) { in pqisrc_scan_devices()
2189 * We don't *really* support actual CD-ROM devices, in pqisrc_scan_devices()
2192 * be a CD-ROM drive. in pqisrc_scan_devices()
2194 if (device->is_obdr_device) in pqisrc_scan_devices()
2199 if (device->is_physical_device) { in pqisrc_scan_devices()
2200 device->ioaccel_handle = in pqisrc_scan_devices()
2201 lun_ext_entry->ioaccel_handle; in pqisrc_scan_devices()
2204 if ( (!softs->page83id_in_rpl) && (bmic_phy_info->device_type == BMIC_DEVICE_TYPE_SATA)) { in pqisrc_scan_devices()
2207 device->sas_address = BE_64(device->wwid); in pqisrc_scan_devices()
2212 if (device->is_physical_device) { in pqisrc_scan_devices()
2213 device->sas_address = BE_64(lun_ext_entry->wwid); in pqisrc_scan_devices()
2250 if(new_device_list[i]->raid_map) in pqisrc_scan_devices()
2251 os_mem_free(softs, (char *)new_device_list[i]->raid_map, in pqisrc_scan_devices()
2270 DBG_FUNC("OUT \n"); in pqisrc_scan_devices()
2285 if(softs->dev_list[i] == NULL) in pqisrc_cleanup_devices()
2287 device = softs->dev_list[i]; in pqisrc_cleanup_devices()
2291 DBG_FUNC("OUT\n"); in pqisrc_cleanup_devices()