1 /*- 2 * Copyright (c) 2018 Microsemi Corporation. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 */ 26 27 /* $FreeBSD$ */ 28 29 #include "smartpqi_includes.h" 30 31 /* Validate the scsi sense response code */ 32 static inline boolean_t pqisrc_scsi_sense_valid(const struct sense_header_scsi *sshdr) 33 { 34 DBG_FUNC("IN\n"); 35 36 if (!sshdr) 37 return false; 38 39 DBG_FUNC("OUT\n"); 40 41 return (sshdr->response_code & 0x70) == 0x70; 42 } 43 44 /* Initialize target ID pool for HBA/PDs */ 45 void pqisrc_init_targetid_pool(pqisrc_softstate_t *softs) 46 { 47 int i, tid = PQI_MAX_PHYSICALS + PQI_MAX_LOGICALS - 1; 48 49 for(i = 0; i < PQI_MAX_PHYSICALS; i++) { 50 softs->tid_pool.tid[i] = tid--; 51 } 52 softs->tid_pool.index = i - 1; 53 } 54 55 int pqisrc_alloc_tid(pqisrc_softstate_t *softs) 56 { 57 if(softs->tid_pool.index <= -1) { 58 DBG_ERR("Target ID exhausted\n"); 59 return INVALID_ELEM; 60 } 61 62 return softs->tid_pool.tid[softs->tid_pool.index--]; 63 } 64 65 void pqisrc_free_tid(pqisrc_softstate_t *softs, int tid) 66 { 67 if(softs->tid_pool.index >= PQI_MAX_PHYSICALS) { 68 DBG_ERR("Target ID queue is full\n"); 69 return; 70 } 71 72 softs->tid_pool.index++; 73 softs->tid_pool.tid[softs->tid_pool.index] = tid; 74 } 75 76 /* Update scsi sense info to a local buffer*/ 77 boolean_t pqisrc_update_scsi_sense(const uint8_t *buff, int len, 78 struct sense_header_scsi *header) 79 { 80 81 DBG_FUNC("IN\n"); 82 83 if (!buff || !len) 84 return false; 85 86 memset(header, 0, sizeof(struct sense_header_scsi)); 87 88 header->response_code = (buff[0] & 0x7f); 89 90 if (!pqisrc_scsi_sense_valid(header)) 91 return false; 92 93 if (header->response_code >= 0x72) { 94 /* descriptor format */ 95 if (len > 1) 96 header->sense_key = (buff[1] & 0xf); 97 if (len > 2) 98 header->asc = buff[2]; 99 if (len > 3) 100 header->ascq = buff[3]; 101 if (len > 7) 102 header->additional_length = buff[7]; 103 } else { 104 /* fixed format */ 105 if (len > 2) 106 header->sense_key = (buff[2] & 0xf); 107 if (len > 7) { 108 len = (len < (buff[7] + 8)) ? 109 len : (buff[7] + 8); 110 if (len > 12) 111 header->asc = buff[12]; 112 if (len > 13) 113 header->ascq = buff[13]; 114 } 115 } 116 117 DBG_FUNC("OUT\n"); 118 119 return true; 120 } 121 122 /* 123 * Function used to build the internal raid request and analyze the response 124 */ 125 int pqisrc_build_send_raid_request(pqisrc_softstate_t *softs, pqisrc_raid_req_t *request, 126 void *buff, size_t datasize, uint8_t cmd, uint16_t vpd_page, uint8_t *scsi3addr, 127 raid_path_error_info_elem_t *error_info) 128 { 129 130 uint8_t *cdb; 131 int ret = PQI_STATUS_SUCCESS; 132 uint32_t tag = 0; 133 struct dma_mem device_mem; 134 sgt_t *sgd; 135 136 ib_queue_t *ib_q = &softs->op_raid_ib_q[PQI_DEFAULT_IB_QUEUE]; 137 ob_queue_t *ob_q = &softs->op_ob_q[PQI_DEFAULT_IB_QUEUE]; 138 139 rcb_t *rcb = NULL; 140 141 DBG_FUNC("IN\n"); 142 143 memset(&device_mem, 0, sizeof(struct dma_mem)); 144 145 /* for TUR datasize: 0 buff: NULL */ 146 if (datasize) { 147 device_mem.tag = "device_mem"; 148 device_mem.size = datasize; 149 device_mem.align = PQISRC_DEFAULT_DMA_ALIGN; 150 151 ret = os_dma_mem_alloc(softs, &device_mem); 152 153 if (ret) { 154 DBG_ERR("failed to allocate dma memory for device_mem return code %d\n", ret); 155 return ret; 156 } 157 158 sgd = (sgt_t *)&request->sg_descriptors[0]; 159 160 sgd->addr = device_mem.dma_addr; 161 sgd->len = datasize; 162 sgd->flags = SG_FLAG_LAST; 163 164 } 165 166 /* Build raid path request */ 167 request->header.iu_type = PQI_IU_TYPE_RAID_PATH_IO_REQUEST; 168 169 request->header.iu_length = LE_16(offsetof(pqisrc_raid_req_t, 170 sg_descriptors[1]) - PQI_REQUEST_HEADER_LENGTH); 171 request->buffer_length = LE_32(datasize); 172 memcpy(request->lun_number, scsi3addr, sizeof(request->lun_number)); 173 request->task_attribute = SOP_TASK_ATTRIBUTE_SIMPLE; 174 request->additional_cdb_bytes_usage = PQI_ADDITIONAL_CDB_BYTES_0; 175 176 cdb = request->cdb; 177 178 switch (cmd) { 179 case SA_INQUIRY: 180 request->data_direction = SOP_DATA_DIR_TO_DEVICE; 181 cdb[0] = SA_INQUIRY; 182 if (vpd_page & VPD_PAGE) { 183 cdb[1] = 0x1; 184 cdb[2] = (uint8_t)vpd_page; 185 } 186 cdb[4] = (uint8_t)datasize; 187 break; 188 case SA_REPORT_LOG: 189 case SA_REPORT_PHYS: 190 request->data_direction = SOP_DATA_DIR_TO_DEVICE; 191 cdb[0] = cmd; 192 if (cmd == SA_REPORT_PHYS) 193 cdb[1] = SA_REPORT_PHYS_EXTENDED; 194 else 195 cdb[1] = SA_REPORT_LOG_EXTENDED; 196 cdb[8] = (uint8_t)((datasize) >> 8); 197 cdb[9] = (uint8_t)datasize; 198 break; 199 case TEST_UNIT_READY: 200 request->data_direction = SOP_DATA_DIR_NONE; 201 break; 202 case SA_GET_RAID_MAP: 203 request->data_direction = SOP_DATA_DIR_TO_DEVICE; 204 cdb[0] = SA_CISS_READ; 205 cdb[1] = cmd; 206 cdb[8] = (uint8_t)((datasize) >> 8); 207 cdb[9] = (uint8_t)datasize; 208 break; 209 case SA_CACHE_FLUSH: 210 request->data_direction = SOP_DATA_DIR_FROM_DEVICE; 211 memcpy(device_mem.virt_addr, buff, datasize); 212 cdb[0] = BMIC_WRITE; 213 cdb[6] = BMIC_CACHE_FLUSH; 214 cdb[7] = (uint8_t)((datasize) << 8); 215 cdb[8] = (uint8_t)((datasize) >> 8); 216 break; 217 case BMIC_IDENTIFY_CONTROLLER: 218 case BMIC_IDENTIFY_PHYSICAL_DEVICE: 219 request->data_direction = SOP_DATA_DIR_TO_DEVICE; 220 cdb[0] = BMIC_READ; 221 cdb[6] = cmd; 222 cdb[7] = (uint8_t)((datasize) << 8); 223 cdb[8] = (uint8_t)((datasize) >> 8); 224 break; 225 case BMIC_WRITE_HOST_WELLNESS: 226 request->data_direction = SOP_DATA_DIR_FROM_DEVICE; 227 memcpy(device_mem.virt_addr, buff, datasize); 228 cdb[0] = BMIC_WRITE; 229 cdb[6] = cmd; 230 cdb[7] = (uint8_t)((datasize) << 8); 231 cdb[8] = (uint8_t)((datasize) >> 8); 232 break; 233 case BMIC_SENSE_SUBSYSTEM_INFORMATION: 234 request->data_direction = SOP_DATA_DIR_TO_DEVICE; 235 cdb[0] = BMIC_READ; 236 cdb[6] = cmd; 237 cdb[7] = (uint8_t)((datasize) << 8); 238 cdb[8] = (uint8_t)((datasize) >> 8); 239 break; 240 default: 241 DBG_ERR("unknown command 0x%x", cmd); 242 break; 243 } 244 245 tag = pqisrc_get_tag(&softs->taglist); 246 if (INVALID_ELEM == tag) { 247 DBG_ERR("Tag not available\n"); 248 ret = PQI_STATUS_FAILURE; 249 goto err_notag; 250 } 251 252 ((pqisrc_raid_req_t *)request)->request_id = tag; 253 ((pqisrc_raid_req_t *)request)->error_index = ((pqisrc_raid_req_t *)request)->request_id; 254 ((pqisrc_raid_req_t *)request)->response_queue_id = ob_q->q_id; 255 rcb = &softs->rcb[tag]; 256 rcb->success_cmp_callback = pqisrc_process_internal_raid_response_success; 257 rcb->error_cmp_callback = pqisrc_process_internal_raid_response_error; 258 259 rcb->req_pending = true; 260 rcb->tag = tag; 261 /* Submit Command */ 262 ret = pqisrc_submit_cmnd(softs, ib_q, request); 263 264 if (ret != PQI_STATUS_SUCCESS) { 265 DBG_ERR("Unable to submit command\n"); 266 goto err_out; 267 } 268 269 ret = pqisrc_wait_on_condition(softs, rcb); 270 if (ret != PQI_STATUS_SUCCESS) { 271 DBG_ERR("Internal RAID request timed out: cmd : 0x%c\n", cmd); 272 goto err_out; 273 } 274 275 if (datasize) { 276 if (buff) { 277 memcpy(buff, device_mem.virt_addr, datasize); 278 } 279 os_dma_mem_free(softs, &device_mem); 280 } 281 282 ret = rcb->status; 283 if (ret) { 284 if(error_info) { 285 memcpy(error_info, 286 rcb->error_info, 287 sizeof(*error_info)); 288 289 if (error_info->data_out_result == 290 PQI_RAID_DATA_IN_OUT_UNDERFLOW) { 291 ret = PQI_STATUS_SUCCESS; 292 } 293 else{ 294 DBG_DISC("Error!! Bus=%u Target=%u, Cmd=0x%x," 295 "Ret=%d\n", BMIC_GET_LEVEL_2_BUS(scsi3addr), 296 BMIC_GET_LEVEL_TWO_TARGET(scsi3addr), 297 cmd, ret); 298 ret = PQI_STATUS_FAILURE; 299 } 300 } 301 } else { 302 if(error_info) { 303 ret = PQI_STATUS_SUCCESS; 304 memset(error_info, 0, sizeof(*error_info)); 305 } 306 } 307 308 os_reset_rcb(rcb); 309 pqisrc_put_tag(&softs->taglist, ((pqisrc_raid_req_t *)request)->request_id); 310 DBG_FUNC("OUT\n"); 311 return ret; 312 313 err_out: 314 DBG_ERR("Error!! Bus=%u Target=%u, Cmd=0x%x, Ret=%d\n", 315 BMIC_GET_LEVEL_2_BUS(scsi3addr), BMIC_GET_LEVEL_TWO_TARGET(scsi3addr), 316 cmd, ret); 317 os_reset_rcb(rcb); 318 pqisrc_put_tag(&softs->taglist, ((pqisrc_raid_req_t *)request)->request_id); 319 err_notag: 320 if (datasize) 321 os_dma_mem_free(softs, &device_mem); 322 DBG_FUNC("FAILED \n"); 323 return ret; 324 } 325 326 /* common function used to send report physical and logical luns cmnds*/ 327 static int pqisrc_report_luns(pqisrc_softstate_t *softs, uint8_t cmd, 328 void *buff, size_t buf_len) 329 { 330 int ret; 331 pqisrc_raid_req_t request; 332 333 DBG_FUNC("IN\n"); 334 335 memset(&request, 0, sizeof(request)); 336 ret = pqisrc_build_send_raid_request(softs, &request, buff, 337 buf_len, cmd, 0, (uint8_t *)RAID_CTLR_LUNID, NULL); 338 339 DBG_FUNC("OUT\n"); 340 341 return ret; 342 } 343 344 /* subroutine used to get physical and logical luns of the device */ 345 static int pqisrc_get_physical_logical_luns(pqisrc_softstate_t *softs, uint8_t cmd, 346 reportlun_data_ext_t **buff, size_t *data_length) 347 { 348 int ret; 349 size_t list_len; 350 size_t data_len; 351 size_t new_lun_list_length; 352 reportlun_data_ext_t *lun_data; 353 reportlun_header_t report_lun_header; 354 355 DBG_FUNC("IN\n"); 356 357 ret = pqisrc_report_luns(softs, cmd, &report_lun_header, 358 sizeof(report_lun_header)); 359 360 if (ret) { 361 DBG_ERR("failed return code: %d\n", ret); 362 return ret; 363 } 364 list_len = BE_32(report_lun_header.list_length); 365 366 retry: 367 data_len = sizeof(reportlun_header_t) + list_len; 368 *data_length = data_len; 369 370 lun_data = os_mem_alloc(softs, data_len); 371 372 if (!lun_data) { 373 DBG_ERR("failed to allocate memory for lun_data\n"); 374 return PQI_STATUS_FAILURE; 375 } 376 377 if (list_len == 0) { 378 DBG_DISC("list_len is 0\n"); 379 memcpy(lun_data, &report_lun_header, sizeof(report_lun_header)); 380 goto out; 381 } 382 383 ret = pqisrc_report_luns(softs, cmd, lun_data, data_len); 384 385 if (ret) { 386 DBG_ERR("error\n"); 387 goto error; 388 } 389 390 new_lun_list_length = BE_32(lun_data->header.list_length); 391 392 if (new_lun_list_length > list_len) { 393 list_len = new_lun_list_length; 394 os_mem_free(softs, (void *)lun_data, data_len); 395 goto retry; 396 } 397 398 out: 399 *buff = lun_data; 400 DBG_FUNC("OUT\n"); 401 return 0; 402 403 error: 404 os_mem_free(softs, (void *)lun_data, data_len); 405 DBG_ERR("FAILED\n"); 406 return ret; 407 } 408 409 /* 410 * Function used to get physical and logical device list 411 */ 412 static int pqisrc_get_phys_log_device_list(pqisrc_softstate_t *softs, 413 reportlun_data_ext_t **physical_dev_list, 414 reportlun_data_ext_t **logical_dev_list, 415 size_t *phys_data_length, 416 size_t *log_data_length) 417 { 418 int ret = PQI_STATUS_SUCCESS; 419 size_t logical_list_length; 420 size_t logdev_data_length; 421 size_t data_length; 422 reportlun_data_ext_t *local_logdev_list; 423 reportlun_data_ext_t *logdev_data; 424 reportlun_header_t report_lun_header; 425 426 427 DBG_FUNC("IN\n"); 428 429 ret = pqisrc_get_physical_logical_luns(softs, SA_REPORT_PHYS, physical_dev_list, phys_data_length); 430 if (ret) { 431 DBG_ERR("report physical LUNs failed"); 432 return ret; 433 } 434 435 ret = pqisrc_get_physical_logical_luns(softs, SA_REPORT_LOG, logical_dev_list, log_data_length); 436 if (ret) { 437 DBG_ERR("report logical LUNs failed"); 438 return ret; 439 } 440 441 442 logdev_data = *logical_dev_list; 443 444 if (logdev_data) { 445 logical_list_length = 446 BE_32(logdev_data->header.list_length); 447 } else { 448 memset(&report_lun_header, 0, sizeof(report_lun_header)); 449 logdev_data = 450 (reportlun_data_ext_t *)&report_lun_header; 451 logical_list_length = 0; 452 } 453 454 logdev_data_length = sizeof(reportlun_header_t) + 455 logical_list_length; 456 457 /* Adding LOGICAL device entry for controller */ 458 local_logdev_list = os_mem_alloc(softs, 459 logdev_data_length + sizeof(reportlun_ext_entry_t)); 460 if (!local_logdev_list) { 461 data_length = *log_data_length; 462 os_mem_free(softs, (char *)*logical_dev_list, data_length); 463 *logical_dev_list = NULL; 464 return PQI_STATUS_FAILURE; 465 } 466 467 memcpy(local_logdev_list, logdev_data, logdev_data_length); 468 memset((uint8_t *)local_logdev_list + logdev_data_length, 0, 469 sizeof(reportlun_ext_entry_t)); 470 local_logdev_list->header.list_length = BE_32(logical_list_length + 471 sizeof(reportlun_ext_entry_t)); 472 data_length = *log_data_length; 473 os_mem_free(softs, (char *)*logical_dev_list, data_length); 474 *log_data_length = logdev_data_length + sizeof(reportlun_ext_entry_t); 475 *logical_dev_list = local_logdev_list; 476 477 DBG_FUNC("OUT\n"); 478 479 return ret; 480 } 481 482 /* Subroutine used to set Bus-Target-Lun for the requested device */ 483 static inline void pqisrc_set_btl(pqi_scsi_dev_t *device, 484 int bus, int target, int lun) 485 { 486 DBG_FUNC("IN\n"); 487 488 device->bus = bus; 489 device->target = target; 490 device->lun = lun; 491 492 DBG_FUNC("OUT\n"); 493 } 494 495 inline boolean_t pqisrc_is_external_raid_device(pqi_scsi_dev_t *device) 496 { 497 return device->is_external_raid_device; 498 } 499 500 static inline boolean_t pqisrc_is_external_raid_addr(uint8_t *scsi3addr) 501 { 502 return scsi3addr[2] != 0; 503 } 504 505 /* Function used to assign Bus-Target-Lun for the requested device */ 506 static void pqisrc_assign_btl(pqi_scsi_dev_t *device) 507 { 508 uint8_t *scsi3addr; 509 uint32_t lunid; 510 uint32_t bus; 511 uint32_t target; 512 uint32_t lun; 513 DBG_FUNC("IN\n"); 514 515 scsi3addr = device->scsi3addr; 516 lunid = GET_LE32(scsi3addr); 517 518 if (pqisrc_is_hba_lunid(scsi3addr)) { 519 /* The specified device is the controller. */ 520 pqisrc_set_btl(device, PQI_HBA_BUS, PQI_CTLR_INDEX, lunid & 0x3fff); 521 device->target_lun_valid = true; 522 return; 523 } 524 525 if (pqisrc_is_logical_device(device)) { 526 if (pqisrc_is_external_raid_device(device)) { 527 DBG_DISC("External Raid Device!!!"); 528 bus = PQI_EXTERNAL_RAID_VOLUME_BUS; 529 target = (lunid >> 16) & 0x3fff; 530 lun = lunid & 0xff; 531 } else { 532 bus = PQI_RAID_VOLUME_BUS; 533 lun = 0; 534 target = lunid & 0x3fff; 535 } 536 pqisrc_set_btl(device, bus, target, lun); 537 device->target_lun_valid = true; 538 return; 539 } 540 541 DBG_FUNC("OUT\n"); 542 } 543 544 /* Build and send the internal INQUIRY command to particular device */ 545 static int pqisrc_send_scsi_inquiry(pqisrc_softstate_t *softs, 546 uint8_t *scsi3addr, uint16_t vpd_page, uint8_t *buff, int buf_len) 547 { 548 int ret = PQI_STATUS_SUCCESS; 549 pqisrc_raid_req_t request; 550 raid_path_error_info_elem_t error_info; 551 552 DBG_FUNC("IN\n"); 553 554 memset(&request, 0, sizeof(request)); 555 ret = pqisrc_build_send_raid_request(softs, &request, buff, buf_len, 556 SA_INQUIRY, vpd_page, scsi3addr, &error_info); 557 558 DBG_FUNC("OUT\n"); 559 return ret; 560 } 561 562 /* Function used to parse the sense information from response */ 563 static void pqisrc_fetch_sense_info(const uint8_t *sense_data, 564 unsigned sense_data_length, uint8_t *sense_key, uint8_t *asc, uint8_t *ascq) 565 { 566 struct sense_header_scsi header; 567 568 DBG_FUNC("IN\n"); 569 570 *sense_key = 0; 571 *ascq = 0; 572 *asc = 0; 573 574 if (pqisrc_update_scsi_sense(sense_data, sense_data_length, &header)) { 575 *sense_key = header.sense_key; 576 *asc = header.asc; 577 *ascq = header.ascq; 578 } 579 580 DBG_DISC("sense_key: %x asc: %x ascq: %x\n", *sense_key, *asc, *ascq); 581 582 DBG_FUNC("OUT\n"); 583 } 584 585 /* Function used to validate volume offline status */ 586 static uint8_t pqisrc_get_volume_offline_status(pqisrc_softstate_t *softs, 587 uint8_t *scsi3addr) 588 { 589 int ret = PQI_STATUS_SUCCESS; 590 uint8_t status = SA_LV_STATUS_VPD_UNSUPPORTED; 591 uint8_t size; 592 uint8_t *buff = NULL; 593 594 DBG_FUNC("IN\n"); 595 596 buff = os_mem_alloc(softs, 64); 597 if (!buff) 598 return PQI_STATUS_FAILURE; 599 600 /* Get the size of the VPD return buff. */ 601 ret = pqisrc_send_scsi_inquiry(softs, scsi3addr, VPD_PAGE | SA_VPD_LV_STATUS, 602 buff, SCSI_VPD_HEADER_LENGTH); 603 604 if (ret) 605 goto out; 606 607 size = buff[3]; 608 609 /* Now get the whole VPD buff. */ 610 ret = pqisrc_send_scsi_inquiry(softs, scsi3addr, VPD_PAGE | SA_VPD_LV_STATUS, 611 buff, size + SCSI_VPD_HEADER_LENGTH); 612 if (ret) 613 goto out; 614 615 status = buff[4]; 616 617 out: 618 os_mem_free(softs, (char *)buff, 64); 619 DBG_FUNC("OUT\n"); 620 621 return status; 622 } 623 624 625 /* Determine offline status of a volume. Returns appropriate SA_LV_* status.*/ 626 static uint8_t pqisrc_get_dev_vol_status(pqisrc_softstate_t *softs, 627 uint8_t *scsi3addr) 628 { 629 int ret = PQI_STATUS_SUCCESS; 630 uint8_t *sense_data; 631 unsigned sense_data_len; 632 uint8_t sense_key; 633 uint8_t asc; 634 uint8_t ascq; 635 uint8_t off_status; 636 uint8_t scsi_status; 637 pqisrc_raid_req_t request; 638 raid_path_error_info_elem_t error_info; 639 640 DBG_FUNC("IN\n"); 641 642 memset(&request, 0, sizeof(request)); 643 ret = pqisrc_build_send_raid_request(softs, &request, NULL, 0, 644 TEST_UNIT_READY, 0, scsi3addr, &error_info); 645 646 if (ret) 647 goto error; 648 sense_data = error_info.data; 649 sense_data_len = LE_16(error_info.sense_data_len); 650 651 if (sense_data_len > sizeof(error_info.data)) 652 sense_data_len = sizeof(error_info.data); 653 654 pqisrc_fetch_sense_info(sense_data, sense_data_len, &sense_key, &asc, 655 &ascq); 656 657 scsi_status = error_info.status; 658 659 /* scsi status: "CHECK CONDN" / SK: "not ready" ? */ 660 if (scsi_status != 2 || 661 sense_key != 2 || 662 asc != ASC_LUN_NOT_READY) { 663 return SA_LV_OK; 664 } 665 666 /* Determine the reason for not ready state. */ 667 off_status = pqisrc_get_volume_offline_status(softs, scsi3addr); 668 669 DBG_DISC("offline_status 0x%x\n", off_status); 670 671 /* Keep volume offline in certain cases. */ 672 switch (off_status) { 673 case SA_LV_UNDERGOING_ERASE: 674 case SA_LV_NOT_AVAILABLE: 675 case SA_LV_UNDERGOING_RPI: 676 case SA_LV_PENDING_RPI: 677 case SA_LV_ENCRYPTED_NO_KEY: 678 case SA_LV_PLAINTEXT_IN_ENCRYPT_ONLY_CONTROLLER: 679 case SA_LV_UNDERGOING_ENCRYPTION: 680 case SA_LV_UNDERGOING_ENCRYPTION_REKEYING: 681 case SA_LV_ENCRYPTED_IN_NON_ENCRYPTED_CONTROLLER: 682 return off_status; 683 case SA_LV_STATUS_VPD_UNSUPPORTED: 684 /* 685 * If the VPD status page isn't available, 686 * use ASC/ASCQ to determine state. 687 */ 688 if (ascq == ASCQ_LUN_NOT_READY_FORMAT_IN_PROGRESS || 689 ascq == ASCQ_LUN_NOT_READY_INITIALIZING_CMD_REQ) 690 return off_status; 691 break; 692 } 693 694 DBG_FUNC("OUT\n"); 695 696 return SA_LV_OK; 697 698 error: 699 return SA_LV_STATUS_VPD_UNSUPPORTED; 700 } 701 702 /* Validate the RAID map parameters */ 703 static int pqisrc_raid_map_validation(pqisrc_softstate_t *softs, 704 pqi_scsi_dev_t *device, pqisrc_raid_map_t *raid_map) 705 { 706 char *error_msg; 707 uint32_t raidmap_size; 708 uint32_t r5or6_blocks_per_row; 709 unsigned phys_dev_num; 710 unsigned num_raidmap_entries; 711 712 DBG_FUNC("IN\n"); 713 714 raidmap_size = LE_32(raid_map->structure_size); 715 if (raidmap_size < offsetof(pqisrc_raid_map_t, dev_data)) { 716 error_msg = "RAID map too small\n"; 717 goto error; 718 } 719 720 if (raidmap_size > sizeof(*raid_map)) { 721 error_msg = "RAID map too large\n"; 722 goto error; 723 } 724 725 phys_dev_num = LE_16(raid_map->layout_map_count) * 726 (LE_16(raid_map->data_disks_per_row) + 727 LE_16(raid_map->metadata_disks_per_row)); 728 num_raidmap_entries = phys_dev_num * 729 LE_16(raid_map->row_cnt); 730 731 if (num_raidmap_entries > RAID_MAP_MAX_ENTRIES) { 732 error_msg = "invalid number of map entries in RAID map\n"; 733 goto error; 734 } 735 736 if (device->raid_level == SA_RAID_1) { 737 if (LE_16(raid_map->layout_map_count) != 2) { 738 error_msg = "invalid RAID-1 map\n"; 739 goto error; 740 } 741 } else if (device->raid_level == SA_RAID_ADM) { 742 if (LE_16(raid_map->layout_map_count) != 3) { 743 error_msg = "invalid RAID-1(ADM) map\n"; 744 goto error; 745 } 746 } else if ((device->raid_level == SA_RAID_5 || 747 device->raid_level == SA_RAID_6) && 748 LE_16(raid_map->layout_map_count) > 1) { 749 /* RAID 50/60 */ 750 r5or6_blocks_per_row = 751 LE_16(raid_map->strip_size) * 752 LE_16(raid_map->data_disks_per_row); 753 if (r5or6_blocks_per_row == 0) { 754 error_msg = "invalid RAID-5 or RAID-6 map\n"; 755 goto error; 756 } 757 } 758 759 DBG_FUNC("OUT\n"); 760 761 return 0; 762 763 error: 764 DBG_ERR("%s\n", error_msg); 765 return PQI_STATUS_FAILURE; 766 } 767 768 /* Get device raidmap for the requested device */ 769 static int pqisrc_get_device_raidmap(pqisrc_softstate_t *softs, 770 pqi_scsi_dev_t *device) 771 { 772 int ret = PQI_STATUS_SUCCESS; 773 pqisrc_raid_req_t request; 774 pqisrc_raid_map_t *raid_map; 775 776 DBG_FUNC("IN\n"); 777 778 raid_map = os_mem_alloc(softs, sizeof(*raid_map)); 779 if (!raid_map) 780 return PQI_STATUS_FAILURE; 781 782 memset(&request, 0, sizeof(request)); 783 ret = pqisrc_build_send_raid_request(softs, &request, raid_map, sizeof(*raid_map), 784 SA_GET_RAID_MAP, 0, device->scsi3addr, NULL); 785 786 if (ret) { 787 DBG_ERR("error in build send raid req ret=%d\n", ret); 788 goto err_out; 789 } 790 791 ret = pqisrc_raid_map_validation(softs, device, raid_map); 792 if (ret) { 793 DBG_ERR("error in raid map validation ret=%d\n", ret); 794 goto err_out; 795 } 796 797 device->raid_map = raid_map; 798 DBG_FUNC("OUT\n"); 799 return 0; 800 801 err_out: 802 os_mem_free(softs, (char*)raid_map, sizeof(*raid_map)); 803 DBG_FUNC("FAILED \n"); 804 return ret; 805 } 806 807 /* Get device ioaccel_status to validate the type of device */ 808 static void pqisrc_get_dev_ioaccel_status(pqisrc_softstate_t *softs, 809 pqi_scsi_dev_t *device) 810 { 811 int ret = PQI_STATUS_SUCCESS; 812 uint8_t *buff; 813 uint8_t ioaccel_status; 814 815 DBG_FUNC("IN\n"); 816 817 buff = os_mem_alloc(softs, 64); 818 if (!buff) 819 return; 820 821 ret = pqisrc_send_scsi_inquiry(softs, device->scsi3addr, 822 VPD_PAGE | SA_VPD_LV_IOACCEL_STATUS, buff, 64); 823 if (ret) { 824 DBG_ERR("error in send scsi inquiry ret=%d\n", ret); 825 goto err_out; 826 } 827 828 ioaccel_status = buff[IOACCEL_STATUS_BYTE]; 829 device->offload_config = 830 !!(ioaccel_status & OFFLOAD_CONFIGURED_BIT); 831 832 if (device->offload_config) { 833 device->offload_enabled_pending = 834 !!(ioaccel_status & OFFLOAD_ENABLED_BIT); 835 if (pqisrc_get_device_raidmap(softs, device)) 836 device->offload_enabled_pending = false; 837 } 838 839 DBG_DISC("offload_config: 0x%x offload_enabled_pending: 0x%x \n", 840 device->offload_config, device->offload_enabled_pending); 841 842 err_out: 843 os_mem_free(softs, (char*)buff, 64); 844 DBG_FUNC("OUT\n"); 845 } 846 847 /* Get RAID level of requested device */ 848 static void pqisrc_get_dev_raid_level(pqisrc_softstate_t *softs, 849 pqi_scsi_dev_t *device) 850 { 851 uint8_t raid_level; 852 uint8_t *buff; 853 854 DBG_FUNC("IN\n"); 855 856 raid_level = SA_RAID_UNKNOWN; 857 858 buff = os_mem_alloc(softs, 64); 859 if (buff) { 860 int ret; 861 ret = pqisrc_send_scsi_inquiry(softs, device->scsi3addr, 862 VPD_PAGE | SA_VPD_LV_DEVICE_GEOMETRY, buff, 64); 863 if (ret == 0) { 864 raid_level = buff[8]; 865 if (raid_level > SA_RAID_MAX) 866 raid_level = SA_RAID_UNKNOWN; 867 } 868 os_mem_free(softs, (char*)buff, 64); 869 } 870 871 device->raid_level = raid_level; 872 DBG_DISC("RAID LEVEL: %x \n", raid_level); 873 DBG_FUNC("OUT\n"); 874 } 875 876 /* Parse the inquiry response and determine the type of device */ 877 static int pqisrc_get_dev_data(pqisrc_softstate_t *softs, 878 pqi_scsi_dev_t *device) 879 { 880 int ret = PQI_STATUS_SUCCESS; 881 uint8_t *inq_buff; 882 883 DBG_FUNC("IN\n"); 884 885 inq_buff = os_mem_alloc(softs, OBDR_TAPE_INQ_SIZE); 886 if (!inq_buff) 887 return PQI_STATUS_FAILURE; 888 889 /* Send an inquiry to the device to see what it is. */ 890 ret = pqisrc_send_scsi_inquiry(softs, device->scsi3addr, 0, inq_buff, 891 OBDR_TAPE_INQ_SIZE); 892 if (ret) 893 goto err_out; 894 pqisrc_sanitize_inquiry_string(&inq_buff[8], 8); 895 pqisrc_sanitize_inquiry_string(&inq_buff[16], 16); 896 897 device->devtype = inq_buff[0] & 0x1f; 898 memcpy(device->vendor, &inq_buff[8], 899 sizeof(device->vendor)); 900 memcpy(device->model, &inq_buff[16], 901 sizeof(device->model)); 902 DBG_DISC("DEV_TYPE: %x VENDOR: %s MODEL: %s\n", device->devtype, device->vendor, device->model); 903 904 if (pqisrc_is_logical_device(device) && device->devtype == DISK_DEVICE) { 905 if (pqisrc_is_external_raid_device(device)) { 906 device->raid_level = SA_RAID_UNKNOWN; 907 device->volume_status = SA_LV_OK; 908 device->volume_offline = false; 909 } 910 else { 911 pqisrc_get_dev_raid_level(softs, device); 912 pqisrc_get_dev_ioaccel_status(softs, device); 913 device->volume_status = pqisrc_get_dev_vol_status(softs, 914 device->scsi3addr); 915 device->volume_offline = device->volume_status != SA_LV_OK; 916 } 917 } 918 919 /* 920 * Check if this is a One-Button-Disaster-Recovery device 921 * by looking for "$DR-10" at offset 43 in the inquiry data. 922 */ 923 device->is_obdr_device = (device->devtype == ROM_DEVICE && 924 memcmp(&inq_buff[OBDR_SIG_OFFSET], OBDR_TAPE_SIG, 925 OBDR_SIG_LEN) == 0); 926 err_out: 927 os_mem_free(softs, (char*)inq_buff, OBDR_TAPE_INQ_SIZE); 928 929 DBG_FUNC("OUT\n"); 930 return ret; 931 } 932 933 /* 934 * BMIC (Basic Management And Interface Commands) command 935 * to get the controller identify params 936 */ 937 static int pqisrc_identify_ctrl(pqisrc_softstate_t *softs, 938 bmic_ident_ctrl_t *buff) 939 { 940 int ret = PQI_STATUS_SUCCESS; 941 pqisrc_raid_req_t request; 942 943 DBG_FUNC("IN\n"); 944 945 memset(&request, 0, sizeof(request)); 946 ret = pqisrc_build_send_raid_request(softs, &request, buff, sizeof(*buff), 947 BMIC_IDENTIFY_CONTROLLER, 0, (uint8_t *)RAID_CTLR_LUNID, NULL); 948 DBG_FUNC("OUT\n"); 949 950 return ret; 951 } 952 953 /* Get the adapter FW version using BMIC_IDENTIFY_CONTROLLER */ 954 int pqisrc_get_ctrl_fw_version(pqisrc_softstate_t *softs) 955 { 956 int ret = PQI_STATUS_SUCCESS; 957 bmic_ident_ctrl_t *identify_ctrl; 958 959 DBG_FUNC("IN\n"); 960 961 identify_ctrl = os_mem_alloc(softs, sizeof(*identify_ctrl)); 962 if (!identify_ctrl) { 963 DBG_ERR("failed to allocate memory for identify_ctrl\n"); 964 return PQI_STATUS_FAILURE; 965 } 966 967 memset(identify_ctrl, 0, sizeof(*identify_ctrl)); 968 969 ret = pqisrc_identify_ctrl(softs, identify_ctrl); 970 if (ret) 971 goto out; 972 973 softs->fw_build_number = identify_ctrl->fw_build_number; 974 memcpy(softs->fw_version, identify_ctrl->fw_version, 975 sizeof(identify_ctrl->fw_version)); 976 softs->fw_version[sizeof(identify_ctrl->fw_version)] = '\0'; 977 snprintf(softs->fw_version + 978 strlen(softs->fw_version), 979 sizeof(softs->fw_version), 980 "-%u", identify_ctrl->fw_build_number); 981 out: 982 os_mem_free(softs, (char *)identify_ctrl, sizeof(*identify_ctrl)); 983 DBG_INIT("Firmware version: %s Firmware build number: %d\n", softs->fw_version, softs->fw_build_number); 984 DBG_FUNC("OUT\n"); 985 return ret; 986 } 987 988 /* BMIC command to determine scsi device identify params */ 989 static int pqisrc_identify_physical_disk(pqisrc_softstate_t *softs, 990 pqi_scsi_dev_t *device, 991 bmic_ident_physdev_t *buff, 992 int buf_len) 993 { 994 int ret = PQI_STATUS_SUCCESS; 995 uint16_t bmic_device_index; 996 pqisrc_raid_req_t request; 997 998 999 DBG_FUNC("IN\n"); 1000 1001 memset(&request, 0, sizeof(request)); 1002 bmic_device_index = BMIC_GET_DRIVE_NUMBER(device->scsi3addr); 1003 request.cdb[2] = (uint8_t)bmic_device_index; 1004 request.cdb[9] = (uint8_t)(bmic_device_index >> 8); 1005 1006 ret = pqisrc_build_send_raid_request(softs, &request, buff, buf_len, 1007 BMIC_IDENTIFY_PHYSICAL_DEVICE, 0, (uint8_t *)RAID_CTLR_LUNID, NULL); 1008 DBG_FUNC("OUT\n"); 1009 return ret; 1010 } 1011 1012 /* 1013 * Function used to get the scsi device information using one of BMIC 1014 * BMIC_IDENTIFY_PHYSICAL_DEVICE 1015 */ 1016 static void pqisrc_get_physical_device_info(pqisrc_softstate_t *softs, 1017 pqi_scsi_dev_t *device, 1018 bmic_ident_physdev_t *id_phys) 1019 { 1020 int ret = PQI_STATUS_SUCCESS; 1021 1022 DBG_FUNC("IN\n"); 1023 memset(id_phys, 0, sizeof(*id_phys)); 1024 1025 ret= pqisrc_identify_physical_disk(softs, device, 1026 id_phys, sizeof(*id_phys)); 1027 if (ret) { 1028 device->queue_depth = PQI_PHYSICAL_DISK_DEFAULT_MAX_QUEUE_DEPTH; 1029 return; 1030 } 1031 1032 device->queue_depth = 1033 LE_16(id_phys->current_queue_depth_limit); 1034 device->device_type = id_phys->device_type; 1035 device->active_path_index = id_phys->active_path_number; 1036 device->path_map = id_phys->redundant_path_present_map; 1037 memcpy(&device->box, 1038 &id_phys->alternate_paths_phys_box_on_port, 1039 sizeof(device->box)); 1040 memcpy(&device->phys_connector, 1041 &id_phys->alternate_paths_phys_connector, 1042 sizeof(device->phys_connector)); 1043 device->bay = id_phys->phys_bay_in_box; 1044 1045 DBG_DISC("BMIC DEV_TYPE: %x QUEUE DEPTH: 0x%x \n", device->device_type, device->queue_depth); 1046 DBG_FUNC("OUT\n"); 1047 } 1048 1049 1050 /* Function used to find the entry of the device in a list */ 1051 static device_status_t pqisrc_scsi_find_entry(pqisrc_softstate_t *softs, 1052 pqi_scsi_dev_t *device_to_find, 1053 pqi_scsi_dev_t **same_device) 1054 { 1055 pqi_scsi_dev_t *device; 1056 int i,j; 1057 DBG_FUNC("IN\n"); 1058 for(i = 0; i < PQI_MAX_DEVICES; i++) { 1059 for(j = 0; j < PQI_MAX_MULTILUN; j++) { 1060 if(softs->device_list[i][j] == NULL) 1061 continue; 1062 device = softs->device_list[i][j]; 1063 if (pqisrc_scsi3addr_equal(device_to_find->scsi3addr, 1064 device->scsi3addr)) { 1065 *same_device = device; 1066 if (pqisrc_device_equal(device_to_find, device)) { 1067 if (device_to_find->volume_offline) 1068 return DEVICE_CHANGED; 1069 return DEVICE_UNCHANGED; 1070 } 1071 return DEVICE_CHANGED; 1072 } 1073 } 1074 } 1075 DBG_FUNC("OUT\n"); 1076 1077 return DEVICE_NOT_FOUND; 1078 } 1079 1080 1081 /* Update the newly added devices as existed device */ 1082 static void pqisrc_exist_device_update(pqisrc_softstate_t *softs, 1083 pqi_scsi_dev_t *device_exist, 1084 pqi_scsi_dev_t *new_device) 1085 { 1086 DBG_FUNC("IN\n"); 1087 device_exist->expose_device = new_device->expose_device; 1088 memcpy(device_exist->vendor, new_device->vendor, 1089 sizeof(device_exist->vendor)); 1090 memcpy(device_exist->model, new_device->model, 1091 sizeof(device_exist->model)); 1092 device_exist->is_physical_device = new_device->is_physical_device; 1093 device_exist->is_external_raid_device = 1094 new_device->is_external_raid_device; 1095 device_exist->sas_address = new_device->sas_address; 1096 device_exist->raid_level = new_device->raid_level; 1097 device_exist->queue_depth = new_device->queue_depth; 1098 device_exist->ioaccel_handle = new_device->ioaccel_handle; 1099 device_exist->volume_status = new_device->volume_status; 1100 device_exist->active_path_index = new_device->active_path_index; 1101 device_exist->path_map = new_device->path_map; 1102 device_exist->bay = new_device->bay; 1103 memcpy(device_exist->box, new_device->box, 1104 sizeof(device_exist->box)); 1105 memcpy(device_exist->phys_connector, new_device->phys_connector, 1106 sizeof(device_exist->phys_connector)); 1107 device_exist->offload_config = new_device->offload_config; 1108 device_exist->offload_enabled = false; 1109 device_exist->offload_enabled_pending = 1110 new_device->offload_enabled_pending; 1111 device_exist->offload_to_mirror = 0; 1112 if (device_exist->raid_map) 1113 os_mem_free(softs, 1114 (char *)device_exist->raid_map, 1115 sizeof(*device_exist->raid_map)); 1116 device_exist->raid_map = new_device->raid_map; 1117 /* To prevent this from being freed later. */ 1118 new_device->raid_map = NULL; 1119 DBG_FUNC("OUT\n"); 1120 } 1121 1122 /* Validate the ioaccel_handle for a newly added device */ 1123 static pqi_scsi_dev_t *pqisrc_identify_device_via_ioaccel( 1124 pqisrc_softstate_t *softs, uint32_t ioaccel_handle) 1125 { 1126 pqi_scsi_dev_t *device; 1127 int i,j; 1128 DBG_FUNC("IN\n"); 1129 for(i = 0; i < PQI_MAX_DEVICES; i++) { 1130 for(j = 0; j < PQI_MAX_MULTILUN; j++) { 1131 if(softs->device_list[i][j] == NULL) 1132 continue; 1133 device = softs->device_list[i][j]; 1134 if (device->devtype != DISK_DEVICE) 1135 continue; 1136 if (pqisrc_is_logical_device(device)) 1137 continue; 1138 if (device->ioaccel_handle == ioaccel_handle) 1139 return device; 1140 } 1141 } 1142 DBG_FUNC("OUT\n"); 1143 1144 return NULL; 1145 } 1146 1147 /* Get the scsi device queue depth */ 1148 static void pqisrc_update_log_dev_qdepth(pqisrc_softstate_t *softs) 1149 { 1150 unsigned i; 1151 unsigned phys_dev_num; 1152 unsigned num_raidmap_entries; 1153 unsigned queue_depth; 1154 pqisrc_raid_map_t *raid_map; 1155 pqi_scsi_dev_t *device; 1156 raidmap_data_t *dev_data; 1157 pqi_scsi_dev_t *phys_disk; 1158 unsigned j; 1159 unsigned k; 1160 1161 DBG_FUNC("IN\n"); 1162 1163 for(i = 0; i < PQI_MAX_DEVICES; i++) { 1164 for(j = 0; j < PQI_MAX_MULTILUN; j++) { 1165 if(softs->device_list[i][j] == NULL) 1166 continue; 1167 device = softs->device_list[i][j]; 1168 if (device->devtype != DISK_DEVICE) 1169 continue; 1170 if (!pqisrc_is_logical_device(device)) 1171 continue; 1172 if (pqisrc_is_external_raid_device(device)) 1173 continue; 1174 device->queue_depth = PQI_LOGICAL_DISK_DEFAULT_MAX_QUEUE_DEPTH; 1175 raid_map = device->raid_map; 1176 if (!raid_map) 1177 return; 1178 dev_data = raid_map->dev_data; 1179 phys_dev_num = LE_16(raid_map->layout_map_count) * 1180 (LE_16(raid_map->data_disks_per_row) + 1181 LE_16(raid_map->metadata_disks_per_row)); 1182 num_raidmap_entries = phys_dev_num * 1183 LE_16(raid_map->row_cnt); 1184 1185 queue_depth = 0; 1186 for (k = 0; k < num_raidmap_entries; k++) { 1187 phys_disk = pqisrc_identify_device_via_ioaccel(softs, 1188 dev_data[k].ioaccel_handle); 1189 1190 if (!phys_disk) { 1191 DBG_WARN( 1192 "Failed to find physical disk handle for logical drive %016llx\n", 1193 (unsigned long long)BE_64(device->scsi3addr[0])); 1194 device->offload_enabled = false; 1195 device->offload_enabled_pending = false; 1196 if (raid_map) 1197 os_mem_free(softs, (char *)raid_map, sizeof(*raid_map)); 1198 device->raid_map = NULL; 1199 return; 1200 } 1201 1202 queue_depth += phys_disk->queue_depth; 1203 } 1204 1205 device->queue_depth = queue_depth; 1206 } /* end inner loop */ 1207 }/* end outer loop */ 1208 DBG_FUNC("OUT\n"); 1209 } 1210 1211 /* Function used to add a scsi device to OS scsi subsystem */ 1212 static int pqisrc_add_device(pqisrc_softstate_t *softs, 1213 pqi_scsi_dev_t *device) 1214 { 1215 DBG_FUNC("IN\n"); 1216 DBG_DISC("vendor: %s model: %s bus:%d target:%d lun:%d is_physical_device:0x%x expose_device:0x%x volume_offline 0x%x volume_status 0x%x \n", 1217 device->vendor, device->model, device->bus, device->target, device->lun, device->is_physical_device, device->expose_device, device->volume_offline, device->volume_status); 1218 1219 device->invalid = false; 1220 1221 if(device->expose_device) { 1222 /* TBD: Call OS upper layer function to add the device entry */ 1223 os_add_device(softs,device); 1224 } 1225 DBG_FUNC("OUT\n"); 1226 return PQI_STATUS_SUCCESS; 1227 1228 } 1229 1230 /* Function used to remove a scsi device from OS scsi subsystem */ 1231 void pqisrc_remove_device(pqisrc_softstate_t *softs, 1232 pqi_scsi_dev_t *device) 1233 { 1234 DBG_FUNC("IN\n"); 1235 DBG_DISC("vendor: %s model: %s bus:%d target:%d lun:%d is_physical_device:0x%x expose_device:0x%x volume_offline 0x%x volume_status 0x%x \n", 1236 device->vendor, device->model, device->bus, device->target, device->lun, device->is_physical_device, device->expose_device, device->volume_offline, device->volume_status); 1237 1238 /* TBD: Call OS upper layer function to remove the device entry */ 1239 device->invalid = true; 1240 os_remove_device(softs,device); 1241 DBG_FUNC("OUT\n"); 1242 } 1243 1244 1245 /* 1246 * When exposing new device to OS fails then adjst list according to the 1247 * mid scsi list 1248 */ 1249 static void pqisrc_adjust_list(pqisrc_softstate_t *softs, 1250 pqi_scsi_dev_t *device) 1251 { 1252 DBG_FUNC("IN\n"); 1253 1254 if (!device) { 1255 DBG_ERR("softs = %p: device is NULL !!!\n", softs); 1256 return; 1257 } 1258 1259 OS_ACQUIRE_SPINLOCK(&softs->devlist_lock); 1260 softs->device_list[device->target][device->lun] = NULL; 1261 OS_RELEASE_SPINLOCK(&softs->devlist_lock); 1262 pqisrc_device_mem_free(softs, device); 1263 1264 DBG_FUNC("OUT\n"); 1265 } 1266 1267 /* Debug routine used to display the RAID volume status of the device */ 1268 static void pqisrc_display_volume_status(pqisrc_softstate_t *softs, 1269 pqi_scsi_dev_t *device) 1270 { 1271 char *status; 1272 1273 DBG_FUNC("IN\n"); 1274 switch (device->volume_status) { 1275 case SA_LV_OK: 1276 status = "Volume is online."; 1277 break; 1278 case SA_LV_UNDERGOING_ERASE: 1279 status = "Volume is undergoing background erase process."; 1280 break; 1281 case SA_LV_NOT_AVAILABLE: 1282 status = "Volume is waiting for transforming volume."; 1283 break; 1284 case SA_LV_UNDERGOING_RPI: 1285 status = "Volume is undergoing rapid parity initialization process."; 1286 break; 1287 case SA_LV_PENDING_RPI: 1288 status = "Volume is queued for rapid parity initialization process."; 1289 break; 1290 case SA_LV_ENCRYPTED_NO_KEY: 1291 status = "Volume is encrypted and cannot be accessed because key is not present."; 1292 break; 1293 case SA_LV_PLAINTEXT_IN_ENCRYPT_ONLY_CONTROLLER: 1294 status = "Volume is not encrypted and cannot be accessed because controller is in encryption-only mode."; 1295 break; 1296 case SA_LV_UNDERGOING_ENCRYPTION: 1297 status = "Volume is undergoing encryption process."; 1298 break; 1299 case SA_LV_UNDERGOING_ENCRYPTION_REKEYING: 1300 status = "Volume is undergoing encryption re-keying process."; 1301 break; 1302 case SA_LV_ENCRYPTED_IN_NON_ENCRYPTED_CONTROLLER: 1303 status = "Volume is encrypted and cannot be accessed because controller does not have encryption enabled."; 1304 break; 1305 case SA_LV_PENDING_ENCRYPTION: 1306 status = "Volume is pending migration to encrypted state, but process has not started."; 1307 break; 1308 case SA_LV_PENDING_ENCRYPTION_REKEYING: 1309 status = "Volume is encrypted and is pending encryption rekeying."; 1310 break; 1311 case SA_LV_STATUS_VPD_UNSUPPORTED: 1312 status = "Volume status is not available through vital product data pages."; 1313 break; 1314 default: 1315 status = "Volume is in an unknown state."; 1316 break; 1317 } 1318 1319 DBG_DISC("scsi BTL %d:%d:%d %s\n", 1320 device->bus, device->target, device->lun, status); 1321 DBG_FUNC("OUT\n"); 1322 } 1323 1324 void pqisrc_device_mem_free(pqisrc_softstate_t *softs, pqi_scsi_dev_t *device) 1325 { 1326 DBG_FUNC("IN\n"); 1327 if (!device) 1328 return; 1329 if (device->raid_map) { 1330 os_mem_free(softs, (char *)device->raid_map, sizeof(pqisrc_raid_map_t)); 1331 } 1332 os_mem_free(softs, (char *)device,sizeof(*device)); 1333 DBG_FUNC("OUT\n"); 1334 1335 } 1336 1337 /* OS should call this function to free the scsi device */ 1338 void pqisrc_free_device(pqisrc_softstate_t * softs,pqi_scsi_dev_t *device) 1339 { 1340 1341 OS_ACQUIRE_SPINLOCK(&softs->devlist_lock); 1342 if (!pqisrc_is_logical_device(device)) { 1343 pqisrc_free_tid(softs,device->target); 1344 } 1345 pqisrc_device_mem_free(softs, device); 1346 OS_RELEASE_SPINLOCK(&softs->devlist_lock); 1347 1348 } 1349 1350 1351 /* Update the newly added devices to the device list */ 1352 static void pqisrc_update_device_list(pqisrc_softstate_t *softs, 1353 pqi_scsi_dev_t *new_device_list[], int num_new_devices) 1354 { 1355 int ret; 1356 int i; 1357 device_status_t dev_status; 1358 pqi_scsi_dev_t *device; 1359 pqi_scsi_dev_t *same_device; 1360 pqi_scsi_dev_t **added = NULL; 1361 pqi_scsi_dev_t **removed = NULL; 1362 int nadded = 0, nremoved = 0; 1363 int j; 1364 int tid = 0; 1365 1366 DBG_FUNC("IN\n"); 1367 1368 added = os_mem_alloc(softs, sizeof(*added) * PQI_MAX_DEVICES); 1369 removed = os_mem_alloc(softs, sizeof(*removed) * PQI_MAX_DEVICES); 1370 1371 if (!added || !removed) { 1372 DBG_WARN("Out of memory \n"); 1373 goto free_and_out; 1374 } 1375 1376 OS_ACQUIRE_SPINLOCK(&softs->devlist_lock); 1377 1378 for(i = 0; i < PQI_MAX_DEVICES; i++) { 1379 for(j = 0; j < PQI_MAX_MULTILUN; j++) { 1380 if(softs->device_list[i][j] == NULL) 1381 continue; 1382 device = softs->device_list[i][j]; 1383 device->device_gone = true; 1384 } 1385 } 1386 DBG_IO("Device list used an array\n"); 1387 for (i = 0; i < num_new_devices; i++) { 1388 device = new_device_list[i]; 1389 1390 dev_status = pqisrc_scsi_find_entry(softs, device, 1391 &same_device); 1392 1393 switch (dev_status) { 1394 case DEVICE_UNCHANGED: 1395 /* New Device present in existing device list */ 1396 device->new_device = false; 1397 same_device->device_gone = false; 1398 pqisrc_exist_device_update(softs, same_device, device); 1399 break; 1400 case DEVICE_NOT_FOUND: 1401 /* Device not found in existing list */ 1402 device->new_device = true; 1403 break; 1404 case DEVICE_CHANGED: 1405 /* Actual device gone need to add device to list*/ 1406 device->new_device = true; 1407 break; 1408 default: 1409 break; 1410 } 1411 } 1412 /* Process all devices that have gone away. */ 1413 for(i = 0, nremoved = 0; i < PQI_MAX_DEVICES; i++) { 1414 for(j = 0; j < PQI_MAX_MULTILUN; j++) { 1415 if(softs->device_list[i][j] == NULL) 1416 continue; 1417 device = softs->device_list[i][j]; 1418 if (device->device_gone) { 1419 softs->device_list[device->target][device->lun] = NULL; 1420 removed[nremoved] = device; 1421 nremoved++; 1422 } 1423 } 1424 } 1425 1426 /* Process all new devices. */ 1427 for (i = 0, nadded = 0; i < num_new_devices; i++) { 1428 device = new_device_list[i]; 1429 if (!device->new_device) 1430 continue; 1431 if (device->volume_offline) 1432 continue; 1433 1434 /* physical device */ 1435 if (!pqisrc_is_logical_device(device)) { 1436 tid = pqisrc_alloc_tid(softs); 1437 if(INVALID_ELEM != tid) 1438 pqisrc_set_btl(device, PQI_PHYSICAL_DEVICE_BUS, tid, 0); 1439 } 1440 1441 softs->device_list[device->target][device->lun] = device; 1442 DBG_DISC("Added device %p at B : %d T : %d L : %d\n",device, 1443 device->bus,device->target,device->lun); 1444 /* To prevent this entry from being freed later. */ 1445 new_device_list[i] = NULL; 1446 added[nadded] = device; 1447 nadded++; 1448 } 1449 1450 pqisrc_update_log_dev_qdepth(softs); 1451 1452 for(i = 0; i < PQI_MAX_DEVICES; i++) { 1453 for(j = 0; j < PQI_MAX_MULTILUN; j++) { 1454 if(softs->device_list[i][j] == NULL) 1455 continue; 1456 device = softs->device_list[i][j]; 1457 device->offload_enabled = device->offload_enabled_pending; 1458 } 1459 } 1460 1461 OS_RELEASE_SPINLOCK(&softs->devlist_lock); 1462 1463 for(i = 0; i < nremoved; i++) { 1464 device = removed[i]; 1465 if (device == NULL) 1466 continue; 1467 pqisrc_remove_device(softs, device); 1468 pqisrc_display_device_info(softs, "removed", device); 1469 1470 } 1471 1472 for(i = 0; i < PQI_MAX_DEVICES; i++) { 1473 for(j = 0; j < PQI_MAX_MULTILUN; j++) { 1474 if(softs->device_list[i][j] == NULL) 1475 continue; 1476 device = softs->device_list[i][j]; 1477 /* 1478 * Notify the OS upper layer if the queue depth of any existing device has 1479 * changed. 1480 */ 1481 if (device->queue_depth != 1482 device->advertised_queue_depth) { 1483 device->advertised_queue_depth = device->queue_depth; 1484 /* TBD: Call OS upper layer function to change device Q depth */ 1485 } 1486 } 1487 } 1488 for(i = 0; i < nadded; i++) { 1489 device = added[i]; 1490 if (device->expose_device) { 1491 ret = pqisrc_add_device(softs, device); 1492 if (ret) { 1493 DBG_WARN("scsi %d:%d:%d addition failed, device not added\n", 1494 device->bus, device->target, 1495 device->lun); 1496 pqisrc_adjust_list(softs, device); 1497 continue; 1498 } 1499 } 1500 1501 pqisrc_display_device_info(softs, "added", device); 1502 } 1503 1504 /* Process all volumes that are offline. */ 1505 for (i = 0; i < num_new_devices; i++) { 1506 device = new_device_list[i]; 1507 if (!device) 1508 continue; 1509 if (!device->new_device) 1510 continue; 1511 if (device->volume_offline) { 1512 pqisrc_display_volume_status(softs, device); 1513 pqisrc_display_device_info(softs, "offline", device); 1514 } 1515 } 1516 1517 free_and_out: 1518 if (added) 1519 os_mem_free(softs, (char *)added, 1520 sizeof(*added) * PQI_MAX_DEVICES); 1521 if (removed) 1522 os_mem_free(softs, (char *)removed, 1523 sizeof(*removed) * PQI_MAX_DEVICES); 1524 1525 DBG_FUNC("OUT\n"); 1526 } 1527 1528 /* 1529 * Let the Adapter know about driver version using one of BMIC 1530 * BMIC_WRITE_HOST_WELLNESS 1531 */ 1532 int pqisrc_write_driver_version_to_host_wellness(pqisrc_softstate_t *softs) 1533 { 1534 int rval = PQI_STATUS_SUCCESS; 1535 struct bmic_host_wellness_driver_version *host_wellness_driver_ver; 1536 size_t data_length; 1537 pqisrc_raid_req_t request; 1538 1539 DBG_FUNC("IN\n"); 1540 1541 memset(&request, 0, sizeof(request)); 1542 data_length = sizeof(*host_wellness_driver_ver); 1543 1544 host_wellness_driver_ver = os_mem_alloc(softs, data_length); 1545 if (!host_wellness_driver_ver) { 1546 DBG_ERR("failed to allocate memory for host wellness driver_version\n"); 1547 return PQI_STATUS_FAILURE; 1548 } 1549 1550 host_wellness_driver_ver->start_tag[0] = '<'; 1551 host_wellness_driver_ver->start_tag[1] = 'H'; 1552 host_wellness_driver_ver->start_tag[2] = 'W'; 1553 host_wellness_driver_ver->start_tag[3] = '>'; 1554 host_wellness_driver_ver->driver_version_tag[0] = 'D'; 1555 host_wellness_driver_ver->driver_version_tag[1] = 'V'; 1556 host_wellness_driver_ver->driver_version_length = LE_16(sizeof(host_wellness_driver_ver->driver_version)); 1557 strncpy(host_wellness_driver_ver->driver_version, softs->os_name, 1558 sizeof(host_wellness_driver_ver->driver_version)); 1559 if (strlen(softs->os_name) < sizeof(host_wellness_driver_ver->driver_version) ) { 1560 strncpy(host_wellness_driver_ver->driver_version + strlen(softs->os_name), PQISRC_DRIVER_VERSION, 1561 sizeof(host_wellness_driver_ver->driver_version) - strlen(softs->os_name)); 1562 } else { 1563 DBG_DISC("OS name length(%lu) is longer than buffer of driver_version\n", 1564 strlen(softs->os_name)); 1565 } 1566 host_wellness_driver_ver->driver_version[sizeof(host_wellness_driver_ver->driver_version) - 1] = '\0'; 1567 host_wellness_driver_ver->end_tag[0] = 'Z'; 1568 host_wellness_driver_ver->end_tag[1] = 'Z'; 1569 1570 rval = pqisrc_build_send_raid_request(softs, &request, host_wellness_driver_ver,data_length, 1571 BMIC_WRITE_HOST_WELLNESS, 0, (uint8_t *)RAID_CTLR_LUNID, NULL); 1572 1573 os_mem_free(softs, (char *)host_wellness_driver_ver, data_length); 1574 1575 DBG_FUNC("OUT"); 1576 return rval; 1577 } 1578 1579 /* 1580 * Write current RTC time from host to the adapter using 1581 * BMIC_WRITE_HOST_WELLNESS 1582 */ 1583 int pqisrc_write_current_time_to_host_wellness(pqisrc_softstate_t *softs) 1584 { 1585 int rval = PQI_STATUS_SUCCESS; 1586 struct bmic_host_wellness_time *host_wellness_time; 1587 size_t data_length; 1588 pqisrc_raid_req_t request; 1589 1590 DBG_FUNC("IN\n"); 1591 1592 memset(&request, 0, sizeof(request)); 1593 data_length = sizeof(*host_wellness_time); 1594 1595 host_wellness_time = os_mem_alloc(softs, data_length); 1596 if (!host_wellness_time) { 1597 DBG_ERR("failed to allocate memory for host wellness time structure\n"); 1598 return PQI_STATUS_FAILURE; 1599 } 1600 1601 host_wellness_time->start_tag[0] = '<'; 1602 host_wellness_time->start_tag[1] = 'H'; 1603 host_wellness_time->start_tag[2] = 'W'; 1604 host_wellness_time->start_tag[3] = '>'; 1605 host_wellness_time->time_tag[0] = 'T'; 1606 host_wellness_time->time_tag[1] = 'D'; 1607 host_wellness_time->time_length = LE_16(offsetof(struct bmic_host_wellness_time, time_length) - 1608 offsetof(struct bmic_host_wellness_time, century)); 1609 1610 os_get_time(host_wellness_time); 1611 1612 host_wellness_time->dont_write_tag[0] = 'D'; 1613 host_wellness_time->dont_write_tag[1] = 'W'; 1614 host_wellness_time->end_tag[0] = 'Z'; 1615 host_wellness_time->end_tag[1] = 'Z'; 1616 1617 rval = pqisrc_build_send_raid_request(softs, &request, host_wellness_time,data_length, 1618 BMIC_WRITE_HOST_WELLNESS, 0, (uint8_t *)RAID_CTLR_LUNID, NULL); 1619 1620 os_mem_free(softs, (char *)host_wellness_time, data_length); 1621 1622 DBG_FUNC("OUT"); 1623 return rval; 1624 } 1625 1626 /* 1627 * Function used to perform a rescan of scsi devices 1628 * for any config change events 1629 */ 1630 int pqisrc_scan_devices(pqisrc_softstate_t *softs) 1631 { 1632 boolean_t is_physical_device; 1633 int ret = PQI_STATUS_FAILURE; 1634 int i; 1635 int new_dev_cnt; 1636 int phy_log_dev_cnt; 1637 uint8_t *scsi3addr; 1638 uint32_t physical_cnt; 1639 uint32_t logical_cnt; 1640 uint32_t ndev_allocated = 0; 1641 size_t phys_data_length, log_data_length; 1642 reportlun_data_ext_t *physical_dev_list = NULL; 1643 reportlun_data_ext_t *logical_dev_list = NULL; 1644 reportlun_ext_entry_t *lun_ext_entry = NULL; 1645 bmic_ident_physdev_t *bmic_phy_info = NULL; 1646 pqi_scsi_dev_t **new_device_list = NULL; 1647 pqi_scsi_dev_t *device = NULL; 1648 1649 1650 DBG_FUNC("IN\n"); 1651 1652 ret = pqisrc_get_phys_log_device_list(softs, &physical_dev_list, &logical_dev_list, 1653 &phys_data_length, &log_data_length); 1654 1655 if (ret) 1656 goto err_out; 1657 1658 physical_cnt = BE_32(physical_dev_list->header.list_length) 1659 / sizeof(physical_dev_list->lun_entries[0]); 1660 1661 logical_cnt = BE_32(logical_dev_list->header.list_length) 1662 / sizeof(logical_dev_list->lun_entries[0]); 1663 1664 DBG_DISC("physical_cnt %d logical_cnt %d\n", physical_cnt, logical_cnt); 1665 1666 if (physical_cnt) { 1667 bmic_phy_info = os_mem_alloc(softs, sizeof(*bmic_phy_info)); 1668 if (bmic_phy_info == NULL) { 1669 ret = PQI_STATUS_FAILURE; 1670 DBG_ERR("failed to allocate memory for BMIC ID PHYS Device : %d\n", ret); 1671 goto err_out; 1672 } 1673 } 1674 phy_log_dev_cnt = physical_cnt + logical_cnt; 1675 new_device_list = os_mem_alloc(softs, 1676 sizeof(*new_device_list) * phy_log_dev_cnt); 1677 1678 if (new_device_list == NULL) { 1679 ret = PQI_STATUS_FAILURE; 1680 DBG_ERR("failed to allocate memory for device list : %d\n", ret); 1681 goto err_out; 1682 } 1683 1684 for (i = 0; i < phy_log_dev_cnt; i++) { 1685 new_device_list[i] = os_mem_alloc(softs, 1686 sizeof(*new_device_list[i])); 1687 if (new_device_list[i] == NULL) { 1688 ret = PQI_STATUS_FAILURE; 1689 DBG_ERR("failed to allocate memory for device list : %d\n", ret); 1690 ndev_allocated = i; 1691 goto err_out; 1692 } 1693 } 1694 1695 ndev_allocated = phy_log_dev_cnt; 1696 new_dev_cnt = 0; 1697 for (i = 0; i < phy_log_dev_cnt; i++) { 1698 1699 if (i < physical_cnt) { 1700 is_physical_device = true; 1701 lun_ext_entry = &physical_dev_list->lun_entries[i]; 1702 } else { 1703 is_physical_device = false; 1704 lun_ext_entry = 1705 &logical_dev_list->lun_entries[i - physical_cnt]; 1706 } 1707 1708 scsi3addr = lun_ext_entry->lunid; 1709 /* Save the target sas adderess for external raid device */ 1710 if(lun_ext_entry->device_type == CONTROLLER_DEVICE) { 1711 int target = lun_ext_entry->lunid[3] & 0x3f; 1712 softs->target_sas_addr[target] = BE_64(lun_ext_entry->wwid); 1713 } 1714 1715 /* Skip masked physical non-disk devices. */ 1716 if (MASKED_DEVICE(scsi3addr) && is_physical_device 1717 && (lun_ext_entry->ioaccel_handle == 0)) 1718 continue; 1719 1720 device = new_device_list[new_dev_cnt]; 1721 memset(device, 0, sizeof(*device)); 1722 memcpy(device->scsi3addr, scsi3addr, sizeof(device->scsi3addr)); 1723 device->wwid = lun_ext_entry->wwid; 1724 device->is_physical_device = is_physical_device; 1725 if (!is_physical_device) 1726 device->is_external_raid_device = 1727 pqisrc_is_external_raid_addr(scsi3addr); 1728 1729 1730 /* Get device type, vendor, model, device ID. */ 1731 ret = pqisrc_get_dev_data(softs, device); 1732 if (ret) { 1733 DBG_WARN("Inquiry failed, skipping device %016llx\n", 1734 (unsigned long long)BE_64(device->scsi3addr[0])); 1735 DBG_DISC("INQUIRY FAILED \n"); 1736 continue; 1737 } 1738 pqisrc_assign_btl(device); 1739 1740 /* 1741 * Expose all devices except for physical devices that 1742 * are masked. 1743 */ 1744 if (device->is_physical_device && 1745 MASKED_DEVICE(scsi3addr)) 1746 device->expose_device = false; 1747 else 1748 device->expose_device = true; 1749 1750 if (device->is_physical_device && 1751 (lun_ext_entry->device_flags & 1752 REPORT_LUN_DEV_FLAG_AIO_ENABLED) && 1753 lun_ext_entry->ioaccel_handle) { 1754 device->aio_enabled = true; 1755 } 1756 switch (device->devtype) { 1757 case ROM_DEVICE: 1758 /* 1759 * We don't *really* support actual CD-ROM devices, 1760 * but we do support the HP "One Button Disaster 1761 * Recovery" tape drive which temporarily pretends to 1762 * be a CD-ROM drive. 1763 */ 1764 if (device->is_obdr_device) 1765 new_dev_cnt++; 1766 break; 1767 case DISK_DEVICE: 1768 case ZBC_DEVICE: 1769 if (device->is_physical_device) { 1770 device->ioaccel_handle = 1771 lun_ext_entry->ioaccel_handle; 1772 device->sas_address = BE_64(lun_ext_entry->wwid); 1773 pqisrc_get_physical_device_info(softs, device, 1774 bmic_phy_info); 1775 } 1776 new_dev_cnt++; 1777 break; 1778 case ENCLOSURE_DEVICE: 1779 if (device->is_physical_device) { 1780 device->sas_address = BE_64(lun_ext_entry->wwid); 1781 } 1782 new_dev_cnt++; 1783 break; 1784 case TAPE_DEVICE: 1785 case MEDIUM_CHANGER_DEVICE: 1786 new_dev_cnt++; 1787 break; 1788 case RAID_DEVICE: 1789 /* 1790 * Only present the HBA controller itself as a RAID 1791 * controller. If it's a RAID controller other than 1792 * the HBA itself (an external RAID controller, MSA500 1793 * or similar), don't present it. 1794 */ 1795 if (pqisrc_is_hba_lunid(scsi3addr)) 1796 new_dev_cnt++; 1797 break; 1798 case SES_DEVICE: 1799 case CONTROLLER_DEVICE: 1800 break; 1801 } 1802 } 1803 DBG_DISC("new_dev_cnt %d\n", new_dev_cnt); 1804 1805 pqisrc_update_device_list(softs, new_device_list, new_dev_cnt); 1806 1807 err_out: 1808 if (new_device_list) { 1809 for (i = 0; i < ndev_allocated; i++) { 1810 if (new_device_list[i]) { 1811 if(new_device_list[i]->raid_map) 1812 os_mem_free(softs, (char *)new_device_list[i]->raid_map, 1813 sizeof(pqisrc_raid_map_t)); 1814 os_mem_free(softs, (char*)new_device_list[i], 1815 sizeof(*new_device_list[i])); 1816 } 1817 } 1818 os_mem_free(softs, (char *)new_device_list, 1819 sizeof(*new_device_list) * ndev_allocated); 1820 } 1821 if(physical_dev_list) 1822 os_mem_free(softs, (char *)physical_dev_list, phys_data_length); 1823 if(logical_dev_list) 1824 os_mem_free(softs, (char *)logical_dev_list, log_data_length); 1825 if (bmic_phy_info) 1826 os_mem_free(softs, (char *)bmic_phy_info, sizeof(*bmic_phy_info)); 1827 1828 DBG_FUNC("OUT \n"); 1829 1830 return ret; 1831 } 1832 1833 /* 1834 * Clean up memory allocated for devices. 1835 */ 1836 void pqisrc_cleanup_devices(pqisrc_softstate_t *softs) 1837 { 1838 1839 int i = 0,j = 0; 1840 pqi_scsi_dev_t *dvp = NULL; 1841 DBG_FUNC("IN\n"); 1842 1843 for(i = 0; i < PQI_MAX_DEVICES; i++) { 1844 for(j = 0; j < PQI_MAX_MULTILUN; j++) { 1845 if (softs->device_list[i][j] == NULL) 1846 continue; 1847 dvp = softs->device_list[i][j]; 1848 pqisrc_device_mem_free(softs, dvp); 1849 } 1850 } 1851 DBG_FUNC("OUT\n"); 1852 } 1853 1854