diff options
Diffstat (limited to 'drivers/scsi/mpt3sas/mpt3sas_base.c')
-rw-r--r-- | drivers/scsi/mpt3sas/mpt3sas_base.c | 668 |
1 files changed, 509 insertions, 159 deletions
diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c b/drivers/scsi/mpt3sas/mpt3sas_base.c index d4f1dcdb8361..11393ebf1a68 100644 --- a/drivers/scsi/mpt3sas/mpt3sas_base.c +++ b/drivers/scsi/mpt3sas/mpt3sas_base.c | |||
@@ -108,9 +108,12 @@ _scsih_set_fwfault_debug(const char *val, struct kernel_param *kp) | |||
108 | if (ret) | 108 | if (ret) |
109 | return ret; | 109 | return ret; |
110 | 110 | ||
111 | /* global ioc spinlock to protect controller list on list operations */ | ||
111 | pr_info("setting fwfault_debug(%d)\n", mpt3sas_fwfault_debug); | 112 | pr_info("setting fwfault_debug(%d)\n", mpt3sas_fwfault_debug); |
113 | spin_lock(&gioc_lock); | ||
112 | list_for_each_entry(ioc, &mpt3sas_ioc_list, list) | 114 | list_for_each_entry(ioc, &mpt3sas_ioc_list, list) |
113 | ioc->fwfault_debug = mpt3sas_fwfault_debug; | 115 | ioc->fwfault_debug = mpt3sas_fwfault_debug; |
116 | spin_unlock(&gioc_lock); | ||
114 | return 0; | 117 | return 0; |
115 | } | 118 | } |
116 | module_param_call(mpt3sas_fwfault_debug, _scsih_set_fwfault_debug, | 119 | module_param_call(mpt3sas_fwfault_debug, _scsih_set_fwfault_debug, |
@@ -157,7 +160,7 @@ _base_fault_reset_work(struct work_struct *work) | |||
157 | 160 | ||
158 | 161 | ||
159 | spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags); | 162 | spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags); |
160 | if (ioc->shost_recovery) | 163 | if (ioc->shost_recovery || ioc->pci_error_recovery) |
161 | goto rearm_timer; | 164 | goto rearm_timer; |
162 | spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); | 165 | spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); |
163 | 166 | ||
@@ -166,6 +169,20 @@ _base_fault_reset_work(struct work_struct *work) | |||
166 | pr_err(MPT3SAS_FMT "SAS host is non-operational !!!!\n", | 169 | pr_err(MPT3SAS_FMT "SAS host is non-operational !!!!\n", |
167 | ioc->name); | 170 | ioc->name); |
168 | 171 | ||
172 | /* It may be possible that EEH recovery can resolve some of | ||
173 | * pci bus failure issues rather removing the dead ioc function | ||
174 | * by considering controller is in a non-operational state. So | ||
175 | * here priority is given to the EEH recovery. If it doesn't | ||
176 | * not resolve this issue, mpt3sas driver will consider this | ||
177 | * controller to non-operational state and remove the dead ioc | ||
178 | * function. | ||
179 | */ | ||
180 | if (ioc->non_operational_loop++ < 5) { | ||
181 | spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, | ||
182 | flags); | ||
183 | goto rearm_timer; | ||
184 | } | ||
185 | |||
169 | /* | 186 | /* |
170 | * Call _scsih_flush_pending_cmds callback so that we flush all | 187 | * Call _scsih_flush_pending_cmds callback so that we flush all |
171 | * pending commands back to OS. This call is required to aovid | 188 | * pending commands back to OS. This call is required to aovid |
@@ -181,7 +198,7 @@ _base_fault_reset_work(struct work_struct *work) | |||
181 | ioc->remove_host = 1; | 198 | ioc->remove_host = 1; |
182 | /*Remove the Dead Host */ | 199 | /*Remove the Dead Host */ |
183 | p = kthread_run(mpt3sas_remove_dead_ioc_func, ioc, | 200 | p = kthread_run(mpt3sas_remove_dead_ioc_func, ioc, |
184 | "mpt3sas_dead_ioc_%d", ioc->id); | 201 | "%s_dead_ioc_%d", ioc->driver_name, ioc->id); |
185 | if (IS_ERR(p)) | 202 | if (IS_ERR(p)) |
186 | pr_err(MPT3SAS_FMT | 203 | pr_err(MPT3SAS_FMT |
187 | "%s: Running mpt3sas_dead_ioc thread failed !!!!\n", | 204 | "%s: Running mpt3sas_dead_ioc thread failed !!!!\n", |
@@ -193,6 +210,8 @@ _base_fault_reset_work(struct work_struct *work) | |||
193 | return; /* don't rearm timer */ | 210 | return; /* don't rearm timer */ |
194 | } | 211 | } |
195 | 212 | ||
213 | ioc->non_operational_loop = 0; | ||
214 | |||
196 | if ((doorbell & MPI2_IOC_STATE_MASK) != MPI2_IOC_STATE_OPERATIONAL) { | 215 | if ((doorbell & MPI2_IOC_STATE_MASK) != MPI2_IOC_STATE_OPERATIONAL) { |
197 | rc = mpt3sas_base_hard_reset_handler(ioc, CAN_SLEEP, | 216 | rc = mpt3sas_base_hard_reset_handler(ioc, CAN_SLEEP, |
198 | FORCE_BIG_HAMMER); | 217 | FORCE_BIG_HAMMER); |
@@ -235,7 +254,8 @@ mpt3sas_base_start_watchdog(struct MPT3SAS_ADAPTER *ioc) | |||
235 | 254 | ||
236 | INIT_DELAYED_WORK(&ioc->fault_reset_work, _base_fault_reset_work); | 255 | INIT_DELAYED_WORK(&ioc->fault_reset_work, _base_fault_reset_work); |
237 | snprintf(ioc->fault_reset_work_q_name, | 256 | snprintf(ioc->fault_reset_work_q_name, |
238 | sizeof(ioc->fault_reset_work_q_name), "poll_%d_status", ioc->id); | 257 | sizeof(ioc->fault_reset_work_q_name), "poll_%s%d_status", |
258 | ioc->driver_name, ioc->id); | ||
239 | ioc->fault_reset_work_q = | 259 | ioc->fault_reset_work_q = |
240 | create_singlethread_workqueue(ioc->fault_reset_work_q_name); | 260 | create_singlethread_workqueue(ioc->fault_reset_work_q_name); |
241 | if (!ioc->fault_reset_work_q) { | 261 | if (!ioc->fault_reset_work_q) { |
@@ -324,7 +344,6 @@ mpt3sas_halt_firmware(struct MPT3SAS_ADAPTER *ioc) | |||
324 | panic("panic in %s\n", __func__); | 344 | panic("panic in %s\n", __func__); |
325 | } | 345 | } |
326 | 346 | ||
327 | #ifdef CONFIG_SCSI_MPT3SAS_LOGGING | ||
328 | /** | 347 | /** |
329 | * _base_sas_ioc_info - verbose translation of the ioc status | 348 | * _base_sas_ioc_info - verbose translation of the ioc status |
330 | * @ioc: per adapter object | 349 | * @ioc: per adapter object |
@@ -578,7 +597,8 @@ _base_display_event_data(struct MPT3SAS_ADAPTER *ioc, | |||
578 | desc = "Device Status Change"; | 597 | desc = "Device Status Change"; |
579 | break; | 598 | break; |
580 | case MPI2_EVENT_IR_OPERATION_STATUS: | 599 | case MPI2_EVENT_IR_OPERATION_STATUS: |
581 | desc = "IR Operation Status"; | 600 | if (!ioc->hide_ir_msg) |
601 | desc = "IR Operation Status"; | ||
582 | break; | 602 | break; |
583 | case MPI2_EVENT_SAS_DISCOVERY: | 603 | case MPI2_EVENT_SAS_DISCOVERY: |
584 | { | 604 | { |
@@ -609,16 +629,20 @@ _base_display_event_data(struct MPT3SAS_ADAPTER *ioc, | |||
609 | desc = "SAS Enclosure Device Status Change"; | 629 | desc = "SAS Enclosure Device Status Change"; |
610 | break; | 630 | break; |
611 | case MPI2_EVENT_IR_VOLUME: | 631 | case MPI2_EVENT_IR_VOLUME: |
612 | desc = "IR Volume"; | 632 | if (!ioc->hide_ir_msg) |
633 | desc = "IR Volume"; | ||
613 | break; | 634 | break; |
614 | case MPI2_EVENT_IR_PHYSICAL_DISK: | 635 | case MPI2_EVENT_IR_PHYSICAL_DISK: |
615 | desc = "IR Physical Disk"; | 636 | if (!ioc->hide_ir_msg) |
637 | desc = "IR Physical Disk"; | ||
616 | break; | 638 | break; |
617 | case MPI2_EVENT_IR_CONFIGURATION_CHANGE_LIST: | 639 | case MPI2_EVENT_IR_CONFIGURATION_CHANGE_LIST: |
618 | desc = "IR Configuration Change List"; | 640 | if (!ioc->hide_ir_msg) |
641 | desc = "IR Configuration Change List"; | ||
619 | break; | 642 | break; |
620 | case MPI2_EVENT_LOG_ENTRY_ADDED: | 643 | case MPI2_EVENT_LOG_ENTRY_ADDED: |
621 | desc = "Log Entry Added"; | 644 | if (!ioc->hide_ir_msg) |
645 | desc = "Log Entry Added"; | ||
622 | break; | 646 | break; |
623 | case MPI2_EVENT_TEMP_THRESHOLD: | 647 | case MPI2_EVENT_TEMP_THRESHOLD: |
624 | desc = "Temperature Threshold"; | 648 | desc = "Temperature Threshold"; |
@@ -630,7 +654,6 @@ _base_display_event_data(struct MPT3SAS_ADAPTER *ioc, | |||
630 | 654 | ||
631 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, desc); | 655 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, desc); |
632 | } | 656 | } |
633 | #endif | ||
634 | 657 | ||
635 | /** | 658 | /** |
636 | * _base_sas_log_info - verbose translation of firmware log info | 659 | * _base_sas_log_info - verbose translation of firmware log info |
@@ -675,7 +698,10 @@ _base_sas_log_info(struct MPT3SAS_ADAPTER *ioc , u32 log_info) | |||
675 | originator_str = "PL"; | 698 | originator_str = "PL"; |
676 | break; | 699 | break; |
677 | case 2: | 700 | case 2: |
678 | originator_str = "IR"; | 701 | if (!ioc->hide_ir_msg) |
702 | originator_str = "IR"; | ||
703 | else | ||
704 | originator_str = "WarpDrive"; | ||
679 | break; | 705 | break; |
680 | } | 706 | } |
681 | 707 | ||
@@ -710,13 +736,13 @@ _base_display_reply_info(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, | |||
710 | return; | 736 | return; |
711 | } | 737 | } |
712 | ioc_status = le16_to_cpu(mpi_reply->IOCStatus); | 738 | ioc_status = le16_to_cpu(mpi_reply->IOCStatus); |
713 | #ifdef CONFIG_SCSI_MPT3SAS_LOGGING | 739 | |
714 | if ((ioc_status & MPI2_IOCSTATUS_MASK) && | 740 | if ((ioc_status & MPI2_IOCSTATUS_MASK) && |
715 | (ioc->logging_level & MPT_DEBUG_REPLY)) { | 741 | (ioc->logging_level & MPT_DEBUG_REPLY)) { |
716 | _base_sas_ioc_info(ioc , mpi_reply, | 742 | _base_sas_ioc_info(ioc , mpi_reply, |
717 | mpt3sas_base_get_msg_frame(ioc, smid)); | 743 | mpt3sas_base_get_msg_frame(ioc, smid)); |
718 | } | 744 | } |
719 | #endif | 745 | |
720 | if (ioc_status & MPI2_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE) { | 746 | if (ioc_status & MPI2_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE) { |
721 | loginfo = le32_to_cpu(mpi_reply->IOCLogInfo); | 747 | loginfo = le32_to_cpu(mpi_reply->IOCLogInfo); |
722 | _base_sas_log_info(ioc, loginfo); | 748 | _base_sas_log_info(ioc, loginfo); |
@@ -783,9 +809,9 @@ _base_async_event(struct MPT3SAS_ADAPTER *ioc, u8 msix_index, u32 reply) | |||
783 | return 1; | 809 | return 1; |
784 | if (mpi_reply->Function != MPI2_FUNCTION_EVENT_NOTIFICATION) | 810 | if (mpi_reply->Function != MPI2_FUNCTION_EVENT_NOTIFICATION) |
785 | return 1; | 811 | return 1; |
786 | #ifdef CONFIG_SCSI_MPT3SAS_LOGGING | 812 | |
787 | _base_display_event_data(ioc, mpi_reply); | 813 | _base_display_event_data(ioc, mpi_reply); |
788 | #endif | 814 | |
789 | if (!(mpi_reply->AckRequired & MPI2_EVENT_NOTIFICATION_ACK_REQUIRED)) | 815 | if (!(mpi_reply->AckRequired & MPI2_EVENT_NOTIFICATION_ACK_REQUIRED)) |
790 | goto out; | 816 | goto out; |
791 | smid = mpt3sas_base_get_smid(ioc, ioc->base_cb_idx); | 817 | smid = mpt3sas_base_get_smid(ioc, ioc->base_cb_idx); |
@@ -1009,6 +1035,12 @@ _base_interrupt(int irq, void *bus_id) | |||
1009 | } | 1035 | } |
1010 | 1036 | ||
1011 | wmb(); | 1037 | wmb(); |
1038 | if (ioc->is_warpdrive) { | ||
1039 | writel(reply_q->reply_post_host_index, | ||
1040 | ioc->reply_post_host_index[msix_index]); | ||
1041 | atomic_dec(&reply_q->busy); | ||
1042 | return IRQ_HANDLED; | ||
1043 | } | ||
1012 | 1044 | ||
1013 | /* Update Reply Post Host Index. | 1045 | /* Update Reply Post Host Index. |
1014 | * For those HBA's which support combined reply queue feature | 1046 | * For those HBA's which support combined reply queue feature |
@@ -1320,6 +1352,149 @@ _base_build_zero_len_sge_ieee(struct MPT3SAS_ADAPTER *ioc, void *paddr) | |||
1320 | } | 1352 | } |
1321 | 1353 | ||
1322 | /** | 1354 | /** |
1355 | * _base_build_sg_scmd - main sg creation routine | ||
1356 | * @ioc: per adapter object | ||
1357 | * @scmd: scsi command | ||
1358 | * @smid: system request message index | ||
1359 | * Context: none. | ||
1360 | * | ||
1361 | * The main routine that builds scatter gather table from a given | ||
1362 | * scsi request sent via the .queuecommand main handler. | ||
1363 | * | ||
1364 | * Returns 0 success, anything else error | ||
1365 | */ | ||
1366 | static int | ||
1367 | _base_build_sg_scmd(struct MPT3SAS_ADAPTER *ioc, | ||
1368 | struct scsi_cmnd *scmd, u16 smid) | ||
1369 | { | ||
1370 | Mpi2SCSIIORequest_t *mpi_request; | ||
1371 | dma_addr_t chain_dma; | ||
1372 | struct scatterlist *sg_scmd; | ||
1373 | void *sg_local, *chain; | ||
1374 | u32 chain_offset; | ||
1375 | u32 chain_length; | ||
1376 | u32 chain_flags; | ||
1377 | int sges_left; | ||
1378 | u32 sges_in_segment; | ||
1379 | u32 sgl_flags; | ||
1380 | u32 sgl_flags_last_element; | ||
1381 | u32 sgl_flags_end_buffer; | ||
1382 | struct chain_tracker *chain_req; | ||
1383 | |||
1384 | mpi_request = mpt3sas_base_get_msg_frame(ioc, smid); | ||
1385 | |||
1386 | /* init scatter gather flags */ | ||
1387 | sgl_flags = MPI2_SGE_FLAGS_SIMPLE_ELEMENT; | ||
1388 | if (scmd->sc_data_direction == DMA_TO_DEVICE) | ||
1389 | sgl_flags |= MPI2_SGE_FLAGS_HOST_TO_IOC; | ||
1390 | sgl_flags_last_element = (sgl_flags | MPI2_SGE_FLAGS_LAST_ELEMENT) | ||
1391 | << MPI2_SGE_FLAGS_SHIFT; | ||
1392 | sgl_flags_end_buffer = (sgl_flags | MPI2_SGE_FLAGS_LAST_ELEMENT | | ||
1393 | MPI2_SGE_FLAGS_END_OF_BUFFER | MPI2_SGE_FLAGS_END_OF_LIST) | ||
1394 | << MPI2_SGE_FLAGS_SHIFT; | ||
1395 | sgl_flags = sgl_flags << MPI2_SGE_FLAGS_SHIFT; | ||
1396 | |||
1397 | sg_scmd = scsi_sglist(scmd); | ||
1398 | sges_left = scsi_dma_map(scmd); | ||
1399 | if (sges_left < 0) { | ||
1400 | sdev_printk(KERN_ERR, scmd->device, | ||
1401 | "pci_map_sg failed: request for %d bytes!\n", | ||
1402 | scsi_bufflen(scmd)); | ||
1403 | return -ENOMEM; | ||
1404 | } | ||
1405 | |||
1406 | sg_local = &mpi_request->SGL; | ||
1407 | sges_in_segment = ioc->max_sges_in_main_message; | ||
1408 | if (sges_left <= sges_in_segment) | ||
1409 | goto fill_in_last_segment; | ||
1410 | |||
1411 | mpi_request->ChainOffset = (offsetof(Mpi2SCSIIORequest_t, SGL) + | ||
1412 | (sges_in_segment * ioc->sge_size))/4; | ||
1413 | |||
1414 | /* fill in main message segment when there is a chain following */ | ||
1415 | while (sges_in_segment) { | ||
1416 | if (sges_in_segment == 1) | ||
1417 | ioc->base_add_sg_single(sg_local, | ||
1418 | sgl_flags_last_element | sg_dma_len(sg_scmd), | ||
1419 | sg_dma_address(sg_scmd)); | ||
1420 | else | ||
1421 | ioc->base_add_sg_single(sg_local, sgl_flags | | ||
1422 | sg_dma_len(sg_scmd), sg_dma_address(sg_scmd)); | ||
1423 | sg_scmd = sg_next(sg_scmd); | ||
1424 | sg_local += ioc->sge_size; | ||
1425 | sges_left--; | ||
1426 | sges_in_segment--; | ||
1427 | } | ||
1428 | |||
1429 | /* initializing the chain flags and pointers */ | ||
1430 | chain_flags = MPI2_SGE_FLAGS_CHAIN_ELEMENT << MPI2_SGE_FLAGS_SHIFT; | ||
1431 | chain_req = _base_get_chain_buffer_tracker(ioc, smid); | ||
1432 | if (!chain_req) | ||
1433 | return -1; | ||
1434 | chain = chain_req->chain_buffer; | ||
1435 | chain_dma = chain_req->chain_buffer_dma; | ||
1436 | do { | ||
1437 | sges_in_segment = (sges_left <= | ||
1438 | ioc->max_sges_in_chain_message) ? sges_left : | ||
1439 | ioc->max_sges_in_chain_message; | ||
1440 | chain_offset = (sges_left == sges_in_segment) ? | ||
1441 | 0 : (sges_in_segment * ioc->sge_size)/4; | ||
1442 | chain_length = sges_in_segment * ioc->sge_size; | ||
1443 | if (chain_offset) { | ||
1444 | chain_offset = chain_offset << | ||
1445 | MPI2_SGE_CHAIN_OFFSET_SHIFT; | ||
1446 | chain_length += ioc->sge_size; | ||
1447 | } | ||
1448 | ioc->base_add_sg_single(sg_local, chain_flags | chain_offset | | ||
1449 | chain_length, chain_dma); | ||
1450 | sg_local = chain; | ||
1451 | if (!chain_offset) | ||
1452 | goto fill_in_last_segment; | ||
1453 | |||
1454 | /* fill in chain segments */ | ||
1455 | while (sges_in_segment) { | ||
1456 | if (sges_in_segment == 1) | ||
1457 | ioc->base_add_sg_single(sg_local, | ||
1458 | sgl_flags_last_element | | ||
1459 | sg_dma_len(sg_scmd), | ||
1460 | sg_dma_address(sg_scmd)); | ||
1461 | else | ||
1462 | ioc->base_add_sg_single(sg_local, sgl_flags | | ||
1463 | sg_dma_len(sg_scmd), | ||
1464 | sg_dma_address(sg_scmd)); | ||
1465 | sg_scmd = sg_next(sg_scmd); | ||
1466 | sg_local += ioc->sge_size; | ||
1467 | sges_left--; | ||
1468 | sges_in_segment--; | ||
1469 | } | ||
1470 | |||
1471 | chain_req = _base_get_chain_buffer_tracker(ioc, smid); | ||
1472 | if (!chain_req) | ||
1473 | return -1; | ||
1474 | chain = chain_req->chain_buffer; | ||
1475 | chain_dma = chain_req->chain_buffer_dma; | ||
1476 | } while (1); | ||
1477 | |||
1478 | |||
1479 | fill_in_last_segment: | ||
1480 | |||
1481 | /* fill the last segment */ | ||
1482 | while (sges_left) { | ||
1483 | if (sges_left == 1) | ||
1484 | ioc->base_add_sg_single(sg_local, sgl_flags_end_buffer | | ||
1485 | sg_dma_len(sg_scmd), sg_dma_address(sg_scmd)); | ||
1486 | else | ||
1487 | ioc->base_add_sg_single(sg_local, sgl_flags | | ||
1488 | sg_dma_len(sg_scmd), sg_dma_address(sg_scmd)); | ||
1489 | sg_scmd = sg_next(sg_scmd); | ||
1490 | sg_local += ioc->sge_size; | ||
1491 | sges_left--; | ||
1492 | } | ||
1493 | |||
1494 | return 0; | ||
1495 | } | ||
1496 | |||
1497 | /** | ||
1323 | * _base_build_sg_scmd_ieee - main sg creation routine for IEEE format | 1498 | * _base_build_sg_scmd_ieee - main sg creation routine for IEEE format |
1324 | * @ioc: per adapter object | 1499 | * @ioc: per adapter object |
1325 | * @scmd: scsi command | 1500 | * @scmd: scsi command |
@@ -1571,6 +1746,14 @@ _base_check_enable_msix(struct MPT3SAS_ADAPTER *ioc) | |||
1571 | int base; | 1746 | int base; |
1572 | u16 message_control; | 1747 | u16 message_control; |
1573 | 1748 | ||
1749 | /* Check whether controller SAS2008 B0 controller, | ||
1750 | * if it is SAS2008 B0 controller use IO-APIC instead of MSIX | ||
1751 | */ | ||
1752 | if (ioc->pdev->device == MPI2_MFGPAGE_DEVID_SAS2008 && | ||
1753 | ioc->pdev->revision == SAS2_PCI_DEVICE_B0_REVISION) { | ||
1754 | return -EINVAL; | ||
1755 | } | ||
1756 | |||
1574 | base = pci_find_capability(ioc->pdev, PCI_CAP_ID_MSIX); | 1757 | base = pci_find_capability(ioc->pdev, PCI_CAP_ID_MSIX); |
1575 | if (!base) { | 1758 | if (!base) { |
1576 | dfailprintk(ioc, pr_info(MPT3SAS_FMT "msix not supported\n", | 1759 | dfailprintk(ioc, pr_info(MPT3SAS_FMT "msix not supported\n", |
@@ -1579,9 +1762,19 @@ _base_check_enable_msix(struct MPT3SAS_ADAPTER *ioc) | |||
1579 | } | 1762 | } |
1580 | 1763 | ||
1581 | /* get msix vector count */ | 1764 | /* get msix vector count */ |
1582 | 1765 | /* NUMA_IO not supported for older controllers */ | |
1583 | pci_read_config_word(ioc->pdev, base + 2, &message_control); | 1766 | if (ioc->pdev->device == MPI2_MFGPAGE_DEVID_SAS2004 || |
1584 | ioc->msix_vector_count = (message_control & 0x3FF) + 1; | 1767 | ioc->pdev->device == MPI2_MFGPAGE_DEVID_SAS2008 || |
1768 | ioc->pdev->device == MPI2_MFGPAGE_DEVID_SAS2108_1 || | ||
1769 | ioc->pdev->device == MPI2_MFGPAGE_DEVID_SAS2108_2 || | ||
1770 | ioc->pdev->device == MPI2_MFGPAGE_DEVID_SAS2108_3 || | ||
1771 | ioc->pdev->device == MPI2_MFGPAGE_DEVID_SAS2116_1 || | ||
1772 | ioc->pdev->device == MPI2_MFGPAGE_DEVID_SAS2116_2) | ||
1773 | ioc->msix_vector_count = 1; | ||
1774 | else { | ||
1775 | pci_read_config_word(ioc->pdev, base + 2, &message_control); | ||
1776 | ioc->msix_vector_count = (message_control & 0x3FF) + 1; | ||
1777 | } | ||
1585 | dinitprintk(ioc, pr_info(MPT3SAS_FMT | 1778 | dinitprintk(ioc, pr_info(MPT3SAS_FMT |
1586 | "msix is supported, vector_count(%d)\n", | 1779 | "msix is supported, vector_count(%d)\n", |
1587 | ioc->name, ioc->msix_vector_count)); | 1780 | ioc->name, ioc->msix_vector_count)); |
@@ -1643,10 +1836,10 @@ _base_request_irq(struct MPT3SAS_ADAPTER *ioc, u8 index, u32 vector) | |||
1643 | atomic_set(&reply_q->busy, 0); | 1836 | atomic_set(&reply_q->busy, 0); |
1644 | if (ioc->msix_enable) | 1837 | if (ioc->msix_enable) |
1645 | snprintf(reply_q->name, MPT_NAME_LENGTH, "%s%d-msix%d", | 1838 | snprintf(reply_q->name, MPT_NAME_LENGTH, "%s%d-msix%d", |
1646 | MPT3SAS_DRIVER_NAME, ioc->id, index); | 1839 | ioc->driver_name, ioc->id, index); |
1647 | else | 1840 | else |
1648 | snprintf(reply_q->name, MPT_NAME_LENGTH, "%s%d", | 1841 | snprintf(reply_q->name, MPT_NAME_LENGTH, "%s%d", |
1649 | MPT3SAS_DRIVER_NAME, ioc->id); | 1842 | ioc->driver_name, ioc->id); |
1650 | r = request_irq(vector, _base_interrupt, IRQF_SHARED, reply_q->name, | 1843 | r = request_irq(vector, _base_interrupt, IRQF_SHARED, reply_q->name, |
1651 | reply_q); | 1844 | reply_q); |
1652 | if (r) { | 1845 | if (r) { |
@@ -1872,7 +2065,7 @@ mpt3sas_base_map_resources(struct MPT3SAS_ADAPTER *ioc) | |||
1872 | 2065 | ||
1873 | 2066 | ||
1874 | if (pci_request_selected_regions(pdev, ioc->bars, | 2067 | if (pci_request_selected_regions(pdev, ioc->bars, |
1875 | MPT3SAS_DRIVER_NAME)) { | 2068 | ioc->driver_name)) { |
1876 | pr_warn(MPT3SAS_FMT "pci_request_selected_regions: failed\n", | 2069 | pr_warn(MPT3SAS_FMT "pci_request_selected_regions: failed\n", |
1877 | ioc->name); | 2070 | ioc->name); |
1878 | ioc->bars = 0; | 2071 | ioc->bars = 0; |
@@ -2158,6 +2351,7 @@ mpt3sas_base_free_smid(struct MPT3SAS_ADAPTER *ioc, u16 smid) | |||
2158 | } | 2351 | } |
2159 | ioc->scsi_lookup[i].cb_idx = 0xFF; | 2352 | ioc->scsi_lookup[i].cb_idx = 0xFF; |
2160 | ioc->scsi_lookup[i].scmd = NULL; | 2353 | ioc->scsi_lookup[i].scmd = NULL; |
2354 | ioc->scsi_lookup[i].direct_io = 0; | ||
2161 | list_add(&ioc->scsi_lookup[i].tracker_list, &ioc->free_list); | 2355 | list_add(&ioc->scsi_lookup[i].tracker_list, &ioc->free_list); |
2162 | spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags); | 2356 | spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags); |
2163 | 2357 | ||
@@ -2318,143 +2512,261 @@ mpt3sas_base_put_smid_default(struct MPT3SAS_ADAPTER *ioc, u16 smid) | |||
2318 | } | 2512 | } |
2319 | 2513 | ||
2320 | /** | 2514 | /** |
2321 | * _base_display_intel_branding - Display branding string | 2515 | * _base_display_OEMs_branding - Display branding string |
2322 | * @ioc: per adapter object | 2516 | * @ioc: per adapter object |
2323 | * | 2517 | * |
2324 | * Return nothing. | 2518 | * Return nothing. |
2325 | */ | 2519 | */ |
2326 | static void | 2520 | static void |
2327 | _base_display_intel_branding(struct MPT3SAS_ADAPTER *ioc) | 2521 | _base_display_OEMs_branding(struct MPT3SAS_ADAPTER *ioc) |
2328 | { | 2522 | { |
2329 | if (ioc->pdev->subsystem_vendor != PCI_VENDOR_ID_INTEL) | 2523 | if (ioc->pdev->subsystem_vendor != PCI_VENDOR_ID_INTEL) |
2330 | return; | 2524 | return; |
2331 | 2525 | ||
2332 | switch (ioc->pdev->device) { | 2526 | switch (ioc->pdev->subsystem_vendor) { |
2333 | case MPI25_MFGPAGE_DEVID_SAS3008: | 2527 | case PCI_VENDOR_ID_INTEL: |
2334 | switch (ioc->pdev->subsystem_device) { | 2528 | switch (ioc->pdev->device) { |
2335 | case MPT3SAS_INTEL_RMS3JC080_SSDID: | 2529 | case MPI2_MFGPAGE_DEVID_SAS2008: |
2336 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, | 2530 | switch (ioc->pdev->subsystem_device) { |
2337 | MPT3SAS_INTEL_RMS3JC080_BRANDING); | 2531 | case MPT2SAS_INTEL_RMS2LL080_SSDID: |
2338 | break; | 2532 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, |
2339 | 2533 | MPT2SAS_INTEL_RMS2LL080_BRANDING); | |
2340 | case MPT3SAS_INTEL_RS3GC008_SSDID: | 2534 | break; |
2341 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, | 2535 | case MPT2SAS_INTEL_RMS2LL040_SSDID: |
2342 | MPT3SAS_INTEL_RS3GC008_BRANDING); | 2536 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, |
2343 | break; | 2537 | MPT2SAS_INTEL_RMS2LL040_BRANDING); |
2344 | case MPT3SAS_INTEL_RS3FC044_SSDID: | 2538 | break; |
2345 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, | 2539 | case MPT2SAS_INTEL_SSD910_SSDID: |
2346 | MPT3SAS_INTEL_RS3FC044_BRANDING); | 2540 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, |
2347 | break; | 2541 | MPT2SAS_INTEL_SSD910_BRANDING); |
2348 | case MPT3SAS_INTEL_RS3UC080_SSDID: | 2542 | break; |
2349 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, | 2543 | default: |
2350 | MPT3SAS_INTEL_RS3UC080_BRANDING); | 2544 | pr_info(MPT3SAS_FMT |
2545 | "Intel(R) Controller: Subsystem ID: 0x%X\n", | ||
2546 | ioc->name, ioc->pdev->subsystem_device); | ||
2547 | break; | ||
2548 | } | ||
2549 | case MPI2_MFGPAGE_DEVID_SAS2308_2: | ||
2550 | switch (ioc->pdev->subsystem_device) { | ||
2551 | case MPT2SAS_INTEL_RS25GB008_SSDID: | ||
2552 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, | ||
2553 | MPT2SAS_INTEL_RS25GB008_BRANDING); | ||
2554 | break; | ||
2555 | case MPT2SAS_INTEL_RMS25JB080_SSDID: | ||
2556 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, | ||
2557 | MPT2SAS_INTEL_RMS25JB080_BRANDING); | ||
2558 | break; | ||
2559 | case MPT2SAS_INTEL_RMS25JB040_SSDID: | ||
2560 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, | ||
2561 | MPT2SAS_INTEL_RMS25JB040_BRANDING); | ||
2562 | break; | ||
2563 | case MPT2SAS_INTEL_RMS25KB080_SSDID: | ||
2564 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, | ||
2565 | MPT2SAS_INTEL_RMS25KB080_BRANDING); | ||
2566 | break; | ||
2567 | case MPT2SAS_INTEL_RMS25KB040_SSDID: | ||
2568 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, | ||
2569 | MPT2SAS_INTEL_RMS25KB040_BRANDING); | ||
2570 | break; | ||
2571 | case MPT2SAS_INTEL_RMS25LB040_SSDID: | ||
2572 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, | ||
2573 | MPT2SAS_INTEL_RMS25LB040_BRANDING); | ||
2574 | break; | ||
2575 | case MPT2SAS_INTEL_RMS25LB080_SSDID: | ||
2576 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, | ||
2577 | MPT2SAS_INTEL_RMS25LB080_BRANDING); | ||
2578 | break; | ||
2579 | default: | ||
2580 | pr_info(MPT3SAS_FMT | ||
2581 | "Intel(R) Controller: Subsystem ID: 0x%X\n", | ||
2582 | ioc->name, ioc->pdev->subsystem_device); | ||
2583 | break; | ||
2584 | } | ||
2585 | case MPI25_MFGPAGE_DEVID_SAS3008: | ||
2586 | switch (ioc->pdev->subsystem_device) { | ||
2587 | case MPT3SAS_INTEL_RMS3JC080_SSDID: | ||
2588 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, | ||
2589 | MPT3SAS_INTEL_RMS3JC080_BRANDING); | ||
2590 | break; | ||
2591 | |||
2592 | case MPT3SAS_INTEL_RS3GC008_SSDID: | ||
2593 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, | ||
2594 | MPT3SAS_INTEL_RS3GC008_BRANDING); | ||
2595 | break; | ||
2596 | case MPT3SAS_INTEL_RS3FC044_SSDID: | ||
2597 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, | ||
2598 | MPT3SAS_INTEL_RS3FC044_BRANDING); | ||
2599 | break; | ||
2600 | case MPT3SAS_INTEL_RS3UC080_SSDID: | ||
2601 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, | ||
2602 | MPT3SAS_INTEL_RS3UC080_BRANDING); | ||
2603 | break; | ||
2604 | default: | ||
2605 | pr_info(MPT3SAS_FMT | ||
2606 | "Intel(R) Controller: Subsystem ID: 0x%X\n", | ||
2607 | ioc->name, ioc->pdev->subsystem_device); | ||
2608 | break; | ||
2609 | } | ||
2351 | break; | 2610 | break; |
2352 | default: | 2611 | default: |
2353 | pr_info(MPT3SAS_FMT | 2612 | pr_info(MPT3SAS_FMT |
2354 | "Intel(R) Controller: Subsystem ID: 0x%X\n", | 2613 | "Intel(R) Controller: Subsystem ID: 0x%X\n", |
2355 | ioc->name, ioc->pdev->subsystem_device); | 2614 | ioc->name, ioc->pdev->subsystem_device); |
2356 | break; | 2615 | break; |
2357 | } | 2616 | } |
2358 | break; | 2617 | break; |
2359 | default: | 2618 | case PCI_VENDOR_ID_DELL: |
2360 | pr_info(MPT3SAS_FMT | 2619 | switch (ioc->pdev->device) { |
2361 | "Intel(R) Controller: Subsystem ID: 0x%X\n", | 2620 | case MPI2_MFGPAGE_DEVID_SAS2008: |
2362 | ioc->name, ioc->pdev->subsystem_device); | 2621 | switch (ioc->pdev->subsystem_device) { |
2363 | break; | 2622 | case MPT2SAS_DELL_6GBPS_SAS_HBA_SSDID: |
2364 | } | 2623 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, |
2365 | } | 2624 | MPT2SAS_DELL_6GBPS_SAS_HBA_BRANDING); |
2366 | 2625 | break; | |
2367 | 2626 | case MPT2SAS_DELL_PERC_H200_ADAPTER_SSDID: | |
2368 | 2627 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, | |
2369 | /** | 2628 | MPT2SAS_DELL_PERC_H200_ADAPTER_BRANDING); |
2370 | * _base_display_dell_branding - Display branding string | 2629 | break; |
2371 | * @ioc: per adapter object | 2630 | case MPT2SAS_DELL_PERC_H200_INTEGRATED_SSDID: |
2372 | * | 2631 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, |
2373 | * Return nothing. | 2632 | MPT2SAS_DELL_PERC_H200_INTEGRATED_BRANDING); |
2374 | */ | 2633 | break; |
2375 | static void | 2634 | case MPT2SAS_DELL_PERC_H200_MODULAR_SSDID: |
2376 | _base_display_dell_branding(struct MPT3SAS_ADAPTER *ioc) | 2635 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, |
2377 | { | 2636 | MPT2SAS_DELL_PERC_H200_MODULAR_BRANDING); |
2378 | if (ioc->pdev->subsystem_vendor != PCI_VENDOR_ID_DELL) | 2637 | break; |
2379 | return; | 2638 | case MPT2SAS_DELL_PERC_H200_EMBEDDED_SSDID: |
2380 | 2639 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, | |
2381 | switch (ioc->pdev->device) { | 2640 | MPT2SAS_DELL_PERC_H200_EMBEDDED_BRANDING); |
2382 | case MPI25_MFGPAGE_DEVID_SAS3008: | 2641 | break; |
2383 | switch (ioc->pdev->subsystem_device) { | 2642 | case MPT2SAS_DELL_PERC_H200_SSDID: |
2384 | case MPT3SAS_DELL_12G_HBA_SSDID: | 2643 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, |
2385 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, | 2644 | MPT2SAS_DELL_PERC_H200_BRANDING); |
2386 | MPT3SAS_DELL_12G_HBA_BRANDING); | 2645 | break; |
2646 | case MPT2SAS_DELL_6GBPS_SAS_SSDID: | ||
2647 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, | ||
2648 | MPT2SAS_DELL_6GBPS_SAS_BRANDING); | ||
2649 | break; | ||
2650 | default: | ||
2651 | pr_info(MPT3SAS_FMT | ||
2652 | "Dell 6Gbps HBA: Subsystem ID: 0x%X\n", | ||
2653 | ioc->name, ioc->pdev->subsystem_device); | ||
2654 | break; | ||
2655 | } | ||
2656 | break; | ||
2657 | case MPI25_MFGPAGE_DEVID_SAS3008: | ||
2658 | switch (ioc->pdev->subsystem_device) { | ||
2659 | case MPT3SAS_DELL_12G_HBA_SSDID: | ||
2660 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, | ||
2661 | MPT3SAS_DELL_12G_HBA_BRANDING); | ||
2662 | break; | ||
2663 | default: | ||
2664 | pr_info(MPT3SAS_FMT | ||
2665 | "Dell 12Gbps HBA: Subsystem ID: 0x%X\n", | ||
2666 | ioc->name, ioc->pdev->subsystem_device); | ||
2667 | break; | ||
2668 | } | ||
2387 | break; | 2669 | break; |
2388 | default: | 2670 | default: |
2389 | pr_info(MPT3SAS_FMT | 2671 | pr_info(MPT3SAS_FMT |
2390 | "Dell 12Gbps HBA: Subsystem ID: 0x%X\n", ioc->name, | 2672 | "Dell HBA: Subsystem ID: 0x%X\n", ioc->name, |
2391 | ioc->pdev->subsystem_device); | 2673 | ioc->pdev->subsystem_device); |
2392 | break; | 2674 | break; |
2393 | } | 2675 | } |
2394 | break; | 2676 | break; |
2395 | default: | 2677 | case PCI_VENDOR_ID_CISCO: |
2396 | pr_info(MPT3SAS_FMT | 2678 | switch (ioc->pdev->device) { |
2397 | "Dell 12Gbps HBA: Subsystem ID: 0x%X\n", ioc->name, | 2679 | case MPI25_MFGPAGE_DEVID_SAS3008: |
2398 | ioc->pdev->subsystem_device); | 2680 | switch (ioc->pdev->subsystem_device) { |
2399 | break; | 2681 | case MPT3SAS_CISCO_12G_8E_HBA_SSDID: |
2400 | } | 2682 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, |
2401 | } | 2683 | MPT3SAS_CISCO_12G_8E_HBA_BRANDING); |
2402 | 2684 | break; | |
2403 | /** | 2685 | case MPT3SAS_CISCO_12G_8I_HBA_SSDID: |
2404 | * _base_display_cisco_branding - Display branding string | 2686 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, |
2405 | * @ioc: per adapter object | 2687 | MPT3SAS_CISCO_12G_8I_HBA_BRANDING); |
2406 | * | 2688 | break; |
2407 | * Return nothing. | 2689 | case MPT3SAS_CISCO_12G_AVILA_HBA_SSDID: |
2408 | */ | 2690 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, |
2409 | static void | 2691 | MPT3SAS_CISCO_12G_AVILA_HBA_BRANDING); |
2410 | _base_display_cisco_branding(struct MPT3SAS_ADAPTER *ioc) | 2692 | break; |
2411 | { | 2693 | default: |
2412 | if (ioc->pdev->subsystem_vendor != PCI_VENDOR_ID_CISCO) | 2694 | pr_info(MPT3SAS_FMT |
2413 | return; | 2695 | "Cisco 12Gbps SAS HBA: Subsystem ID: 0x%X\n", |
2414 | 2696 | ioc->name, ioc->pdev->subsystem_device); | |
2415 | switch (ioc->pdev->device) { | 2697 | break; |
2416 | case MPI25_MFGPAGE_DEVID_SAS3008: | 2698 | } |
2417 | switch (ioc->pdev->subsystem_device) { | ||
2418 | case MPT3SAS_CISCO_12G_8E_HBA_SSDID: | ||
2419 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, | ||
2420 | MPT3SAS_CISCO_12G_8E_HBA_BRANDING); | ||
2421 | break; | ||
2422 | case MPT3SAS_CISCO_12G_8I_HBA_SSDID: | ||
2423 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, | ||
2424 | MPT3SAS_CISCO_12G_8I_HBA_BRANDING); | ||
2425 | break; | 2699 | break; |
2426 | case MPT3SAS_CISCO_12G_AVILA_HBA_SSDID: | 2700 | case MPI25_MFGPAGE_DEVID_SAS3108_1: |
2427 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, | 2701 | switch (ioc->pdev->subsystem_device) { |
2702 | case MPT3SAS_CISCO_12G_AVILA_HBA_SSDID: | ||
2703 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, | ||
2428 | MPT3SAS_CISCO_12G_AVILA_HBA_BRANDING); | 2704 | MPT3SAS_CISCO_12G_AVILA_HBA_BRANDING); |
2705 | break; | ||
2706 | case MPT3SAS_CISCO_12G_COLUSA_MEZZANINE_HBA_SSDID: | ||
2707 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, | ||
2708 | MPT3SAS_CISCO_12G_COLUSA_MEZZANINE_HBA_BRANDING | ||
2709 | ); | ||
2710 | break; | ||
2711 | default: | ||
2712 | pr_info(MPT3SAS_FMT | ||
2713 | "Cisco 12Gbps SAS HBA: Subsystem ID: 0x%X\n", | ||
2714 | ioc->name, ioc->pdev->subsystem_device); | ||
2715 | break; | ||
2716 | } | ||
2429 | break; | 2717 | break; |
2430 | default: | 2718 | default: |
2431 | pr_info(MPT3SAS_FMT | 2719 | pr_info(MPT3SAS_FMT |
2432 | "Cisco 12Gbps SAS HBA: Subsystem ID: 0x%X\n", | 2720 | "Cisco SAS HBA: Subsystem ID: 0x%X\n", |
2433 | ioc->name, ioc->pdev->subsystem_device); | 2721 | ioc->name, ioc->pdev->subsystem_device); |
2434 | break; | 2722 | break; |
2435 | } | 2723 | } |
2436 | break; | 2724 | break; |
2437 | case MPI25_MFGPAGE_DEVID_SAS3108_1: | 2725 | case MPT2SAS_HP_3PAR_SSVID: |
2438 | switch (ioc->pdev->subsystem_device) { | 2726 | switch (ioc->pdev->device) { |
2439 | case MPT3SAS_CISCO_12G_AVILA_HBA_SSDID: | 2727 | case MPI2_MFGPAGE_DEVID_SAS2004: |
2440 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, | 2728 | switch (ioc->pdev->subsystem_device) { |
2441 | MPT3SAS_CISCO_12G_AVILA_HBA_BRANDING); | 2729 | case MPT2SAS_HP_DAUGHTER_2_4_INTERNAL_SSDID: |
2442 | break; | 2730 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, |
2443 | case MPT3SAS_CISCO_12G_COLUSA_MEZZANINE_HBA_SSDID: | 2731 | MPT2SAS_HP_DAUGHTER_2_4_INTERNAL_BRANDING); |
2444 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, | 2732 | break; |
2445 | MPT3SAS_CISCO_12G_COLUSA_MEZZANINE_HBA_BRANDING); | 2733 | default: |
2446 | break; | 2734 | pr_info(MPT3SAS_FMT |
2735 | "HP 6Gbps SAS HBA: Subsystem ID: 0x%X\n", | ||
2736 | ioc->name, ioc->pdev->subsystem_device); | ||
2737 | break; | ||
2738 | } | ||
2739 | case MPI2_MFGPAGE_DEVID_SAS2308_2: | ||
2740 | switch (ioc->pdev->subsystem_device) { | ||
2741 | case MPT2SAS_HP_2_4_INTERNAL_SSDID: | ||
2742 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, | ||
2743 | MPT2SAS_HP_2_4_INTERNAL_BRANDING); | ||
2744 | break; | ||
2745 | case MPT2SAS_HP_2_4_EXTERNAL_SSDID: | ||
2746 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, | ||
2747 | MPT2SAS_HP_2_4_EXTERNAL_BRANDING); | ||
2748 | break; | ||
2749 | case MPT2SAS_HP_1_4_INTERNAL_1_4_EXTERNAL_SSDID: | ||
2750 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, | ||
2751 | MPT2SAS_HP_1_4_INTERNAL_1_4_EXTERNAL_BRANDING); | ||
2752 | break; | ||
2753 | case MPT2SAS_HP_EMBEDDED_2_4_INTERNAL_SSDID: | ||
2754 | pr_info(MPT3SAS_FMT "%s\n", ioc->name, | ||
2755 | MPT2SAS_HP_EMBEDDED_2_4_INTERNAL_BRANDING); | ||
2756 | break; | ||
2757 | default: | ||
2758 | pr_info(MPT3SAS_FMT | ||
2759 | "HP 6Gbps SAS HBA: Subsystem ID: 0x%X\n", | ||
2760 | ioc->name, ioc->pdev->subsystem_device); | ||
2761 | break; | ||
2762 | } | ||
2447 | default: | 2763 | default: |
2448 | pr_info(MPT3SAS_FMT | 2764 | pr_info(MPT3SAS_FMT |
2449 | "Cisco 12Gbps SAS HBA: Subsystem ID: 0x%X\n", | 2765 | "HP SAS HBA: Subsystem ID: 0x%X\n", |
2450 | ioc->name, ioc->pdev->subsystem_device); | 2766 | ioc->name, ioc->pdev->subsystem_device); |
2451 | break; | 2767 | break; |
2452 | } | 2768 | } |
2453 | break; | ||
2454 | default: | 2769 | default: |
2455 | pr_info(MPT3SAS_FMT | ||
2456 | "Cisco 12Gbps SAS HBA: Subsystem ID: 0x%X\n", | ||
2457 | ioc->name, ioc->pdev->subsystem_device); | ||
2458 | break; | 2770 | break; |
2459 | } | 2771 | } |
2460 | } | 2772 | } |
@@ -2488,9 +2800,7 @@ _base_display_ioc_capabilities(struct MPT3SAS_ADAPTER *ioc) | |||
2488 | (bios_version & 0x0000FF00) >> 8, | 2800 | (bios_version & 0x0000FF00) >> 8, |
2489 | bios_version & 0x000000FF); | 2801 | bios_version & 0x000000FF); |
2490 | 2802 | ||
2491 | _base_display_intel_branding(ioc); | 2803 | _base_display_OEMs_branding(ioc); |
2492 | _base_display_dell_branding(ioc); | ||
2493 | _base_display_cisco_branding(ioc); | ||
2494 | 2804 | ||
2495 | pr_info(MPT3SAS_FMT "Protocol=(", ioc->name); | 2805 | pr_info(MPT3SAS_FMT "Protocol=(", ioc->name); |
2496 | 2806 | ||
@@ -2508,10 +2818,12 @@ _base_display_ioc_capabilities(struct MPT3SAS_ADAPTER *ioc) | |||
2508 | pr_info("), "); | 2818 | pr_info("), "); |
2509 | pr_info("Capabilities=("); | 2819 | pr_info("Capabilities=("); |
2510 | 2820 | ||
2511 | if (ioc->facts.IOCCapabilities & | 2821 | if (!ioc->hide_ir_msg) { |
2822 | if (ioc->facts.IOCCapabilities & | ||
2512 | MPI2_IOCFACTS_CAPABILITY_INTEGRATED_RAID) { | 2823 | MPI2_IOCFACTS_CAPABILITY_INTEGRATED_RAID) { |
2513 | pr_info("Raid"); | 2824 | pr_info("Raid"); |
2514 | i++; | 2825 | i++; |
2826 | } | ||
2515 | } | 2827 | } |
2516 | 2828 | ||
2517 | if (ioc->facts.IOCCapabilities & MPI2_IOCFACTS_CAPABILITY_TLR) { | 2829 | if (ioc->facts.IOCCapabilities & MPI2_IOCFACTS_CAPABILITY_TLR) { |
@@ -2852,18 +3164,22 @@ _base_allocate_memory_pools(struct MPT3SAS_ADAPTER *ioc, int sleep_flag) | |||
2852 | /* command line tunables for max sgl entries */ | 3164 | /* command line tunables for max sgl entries */ |
2853 | if (max_sgl_entries != -1) | 3165 | if (max_sgl_entries != -1) |
2854 | sg_tablesize = max_sgl_entries; | 3166 | sg_tablesize = max_sgl_entries; |
2855 | else | 3167 | else { |
2856 | sg_tablesize = MPT3SAS_SG_DEPTH; | 3168 | if (ioc->hba_mpi_version_belonged == MPI2_VERSION) |
3169 | sg_tablesize = MPT2SAS_SG_DEPTH; | ||
3170 | else | ||
3171 | sg_tablesize = MPT3SAS_SG_DEPTH; | ||
3172 | } | ||
2857 | 3173 | ||
2858 | if (sg_tablesize < MPT3SAS_MIN_PHYS_SEGMENTS) | 3174 | if (sg_tablesize < MPT_MIN_PHYS_SEGMENTS) |
2859 | sg_tablesize = MPT3SAS_MIN_PHYS_SEGMENTS; | 3175 | sg_tablesize = MPT_MIN_PHYS_SEGMENTS; |
2860 | else if (sg_tablesize > MPT3SAS_MAX_PHYS_SEGMENTS) { | 3176 | else if (sg_tablesize > MPT_MAX_PHYS_SEGMENTS) { |
2861 | sg_tablesize = min_t(unsigned short, sg_tablesize, | 3177 | sg_tablesize = min_t(unsigned short, sg_tablesize, |
2862 | SCSI_MAX_SG_CHAIN_SEGMENTS); | 3178 | SCSI_MAX_SG_CHAIN_SEGMENTS); |
2863 | pr_warn(MPT3SAS_FMT | 3179 | pr_warn(MPT3SAS_FMT |
2864 | "sg_tablesize(%u) is bigger than kernel" | 3180 | "sg_tablesize(%u) is bigger than kernel" |
2865 | " defined SCSI_MAX_SG_SEGMENTS(%u)\n", ioc->name, | 3181 | " defined SCSI_MAX_SG_SEGMENTS(%u)\n", ioc->name, |
2866 | sg_tablesize, MPT3SAS_MAX_PHYS_SEGMENTS); | 3182 | sg_tablesize, MPT_MAX_PHYS_SEGMENTS); |
2867 | } | 3183 | } |
2868 | ioc->shost->sg_tablesize = sg_tablesize; | 3184 | ioc->shost->sg_tablesize = sg_tablesize; |
2869 | 3185 | ||
@@ -4021,7 +4337,7 @@ _base_send_ioc_init(struct MPT3SAS_ADAPTER *ioc, int sleep_flag) | |||
4021 | mpi_request.WhoInit = MPI2_WHOINIT_HOST_DRIVER; | 4337 | mpi_request.WhoInit = MPI2_WHOINIT_HOST_DRIVER; |
4022 | mpi_request.VF_ID = 0; /* TODO */ | 4338 | mpi_request.VF_ID = 0; /* TODO */ |
4023 | mpi_request.VP_ID = 0; | 4339 | mpi_request.VP_ID = 0; |
4024 | mpi_request.MsgVersion = cpu_to_le16(MPI25_VERSION); | 4340 | mpi_request.MsgVersion = cpu_to_le16(ioc->hba_mpi_version_belonged); |
4025 | mpi_request.HeaderVersion = cpu_to_le16(MPI2_HEADER_VERSION); | 4341 | mpi_request.HeaderVersion = cpu_to_le16(MPI2_HEADER_VERSION); |
4026 | 4342 | ||
4027 | if (_base_is_controller_msix_enabled(ioc)) | 4343 | if (_base_is_controller_msix_enabled(ioc)) |
@@ -4655,6 +4971,7 @@ _base_make_ioc_operational(struct MPT3SAS_ADAPTER *ioc, int sleep_flag) | |||
4655 | u32 reply_address; | 4971 | u32 reply_address; |
4656 | u16 smid; | 4972 | u16 smid; |
4657 | struct _tr_list *delayed_tr, *delayed_tr_next; | 4973 | struct _tr_list *delayed_tr, *delayed_tr_next; |
4974 | u8 hide_flag; | ||
4658 | struct adapter_reply_queue *reply_q; | 4975 | struct adapter_reply_queue *reply_q; |
4659 | long reply_post_free; | 4976 | long reply_post_free; |
4660 | u32 reply_post_free_sz, index = 0; | 4977 | u32 reply_post_free_sz, index = 0; |
@@ -4685,6 +5002,7 @@ _base_make_ioc_operational(struct MPT3SAS_ADAPTER *ioc, int sleep_flag) | |||
4685 | ioc->scsi_lookup[i].cb_idx = 0xFF; | 5002 | ioc->scsi_lookup[i].cb_idx = 0xFF; |
4686 | ioc->scsi_lookup[i].smid = smid; | 5003 | ioc->scsi_lookup[i].smid = smid; |
4687 | ioc->scsi_lookup[i].scmd = NULL; | 5004 | ioc->scsi_lookup[i].scmd = NULL; |
5005 | ioc->scsi_lookup[i].direct_io = 0; | ||
4688 | list_add_tail(&ioc->scsi_lookup[i].tracker_list, | 5006 | list_add_tail(&ioc->scsi_lookup[i].tracker_list, |
4689 | &ioc->free_list); | 5007 | &ioc->free_list); |
4690 | } | 5008 | } |
@@ -4787,6 +5105,16 @@ _base_make_ioc_operational(struct MPT3SAS_ADAPTER *ioc, int sleep_flag) | |||
4787 | 5105 | ||
4788 | 5106 | ||
4789 | if (ioc->is_driver_loading) { | 5107 | if (ioc->is_driver_loading) { |
5108 | |||
5109 | if (ioc->is_warpdrive && ioc->manu_pg10.OEMIdentifier | ||
5110 | == 0x80) { | ||
5111 | hide_flag = (u8) ( | ||
5112 | le32_to_cpu(ioc->manu_pg10.OEMSpecificFlags0) & | ||
5113 | MFG_PAGE10_HIDE_SSDS_MASK); | ||
5114 | if (hide_flag != MFG_PAGE10_HIDE_SSDS_MASK) | ||
5115 | ioc->mfg_pg10_hide_flag = hide_flag; | ||
5116 | } | ||
5117 | |||
4790 | ioc->wait_for_discovery_to_complete = | 5118 | ioc->wait_for_discovery_to_complete = |
4791 | _base_determine_wait_on_discovery(ioc); | 5119 | _base_determine_wait_on_discovery(ioc); |
4792 | 5120 | ||
@@ -4812,6 +5140,8 @@ mpt3sas_base_free_resources(struct MPT3SAS_ADAPTER *ioc) | |||
4812 | dexitprintk(ioc, pr_info(MPT3SAS_FMT "%s\n", ioc->name, | 5140 | dexitprintk(ioc, pr_info(MPT3SAS_FMT "%s\n", ioc->name, |
4813 | __func__)); | 5141 | __func__)); |
4814 | 5142 | ||
5143 | /* synchronizing freeing resource with pci_access_mutex lock */ | ||
5144 | mutex_lock(&ioc->pci_access_mutex); | ||
4815 | if (ioc->chip_phys && ioc->chip) { | 5145 | if (ioc->chip_phys && ioc->chip) { |
4816 | _base_mask_interrupts(ioc); | 5146 | _base_mask_interrupts(ioc); |
4817 | ioc->shost_recovery = 1; | 5147 | ioc->shost_recovery = 1; |
@@ -4820,6 +5150,7 @@ mpt3sas_base_free_resources(struct MPT3SAS_ADAPTER *ioc) | |||
4820 | } | 5150 | } |
4821 | 5151 | ||
4822 | mpt3sas_base_unmap_resources(ioc); | 5152 | mpt3sas_base_unmap_resources(ioc); |
5153 | mutex_unlock(&ioc->pci_access_mutex); | ||
4823 | return; | 5154 | return; |
4824 | } | 5155 | } |
4825 | 5156 | ||
@@ -4834,7 +5165,6 @@ mpt3sas_base_attach(struct MPT3SAS_ADAPTER *ioc) | |||
4834 | { | 5165 | { |
4835 | int r, i; | 5166 | int r, i; |
4836 | int cpu_id, last_cpu_id = 0; | 5167 | int cpu_id, last_cpu_id = 0; |
4837 | u8 revision; | ||
4838 | 5168 | ||
4839 | dinitprintk(ioc, pr_info(MPT3SAS_FMT "%s\n", ioc->name, | 5169 | dinitprintk(ioc, pr_info(MPT3SAS_FMT "%s\n", ioc->name, |
4840 | __func__)); | 5170 | __func__)); |
@@ -4854,19 +5184,16 @@ mpt3sas_base_attach(struct MPT3SAS_ADAPTER *ioc) | |||
4854 | goto out_free_resources; | 5184 | goto out_free_resources; |
4855 | } | 5185 | } |
4856 | 5186 | ||
4857 | /* Check whether the controller revision is C0 or above. | 5187 | if (ioc->is_warpdrive) { |
4858 | * only C0 and above revision controllers support 96 MSI-X vectors. | 5188 | ioc->reply_post_host_index = kcalloc(ioc->cpu_msix_table_sz, |
4859 | */ | 5189 | sizeof(resource_size_t *), GFP_KERNEL); |
4860 | revision = ioc->pdev->revision; | 5190 | if (!ioc->reply_post_host_index) { |
4861 | 5191 | dfailprintk(ioc, pr_info(MPT3SAS_FMT "allocation " | |
4862 | if ((ioc->pdev->device == MPI25_MFGPAGE_DEVID_SAS3004 || | 5192 | "for cpu_msix_table failed!!!\n", ioc->name)); |
4863 | ioc->pdev->device == MPI25_MFGPAGE_DEVID_SAS3008 || | 5193 | r = -ENOMEM; |
4864 | ioc->pdev->device == MPI25_MFGPAGE_DEVID_SAS3108_1 || | 5194 | goto out_free_resources; |
4865 | ioc->pdev->device == MPI25_MFGPAGE_DEVID_SAS3108_2 || | 5195 | } |
4866 | ioc->pdev->device == MPI25_MFGPAGE_DEVID_SAS3108_5 || | 5196 | } |
4867 | ioc->pdev->device == MPI25_MFGPAGE_DEVID_SAS3108_6) && | ||
4868 | (revision >= 0x02)) | ||
4869 | ioc->msix96_vector = 1; | ||
4870 | 5197 | ||
4871 | ioc->rdpq_array_enable_assigned = 0; | 5198 | ioc->rdpq_array_enable_assigned = 0; |
4872 | ioc->dma_mask = 0; | 5199 | ioc->dma_mask = 0; |
@@ -4874,23 +5201,41 @@ mpt3sas_base_attach(struct MPT3SAS_ADAPTER *ioc) | |||
4874 | if (r) | 5201 | if (r) |
4875 | goto out_free_resources; | 5202 | goto out_free_resources; |
4876 | 5203 | ||
5204 | if (ioc->is_warpdrive) { | ||
5205 | ioc->reply_post_host_index[0] = (resource_size_t __iomem *) | ||
5206 | &ioc->chip->ReplyPostHostIndex; | ||
5207 | |||
5208 | for (i = 1; i < ioc->cpu_msix_table_sz; i++) | ||
5209 | ioc->reply_post_host_index[i] = | ||
5210 | (resource_size_t __iomem *) | ||
5211 | ((u8 __iomem *)&ioc->chip->Doorbell + (0x4000 + ((i - 1) | ||
5212 | * 4))); | ||
5213 | } | ||
4877 | 5214 | ||
4878 | pci_set_drvdata(ioc->pdev, ioc->shost); | 5215 | pci_set_drvdata(ioc->pdev, ioc->shost); |
4879 | r = _base_get_ioc_facts(ioc, CAN_SLEEP); | 5216 | r = _base_get_ioc_facts(ioc, CAN_SLEEP); |
4880 | if (r) | 5217 | if (r) |
4881 | goto out_free_resources; | 5218 | goto out_free_resources; |
4882 | 5219 | ||
4883 | /* | 5220 | switch (ioc->hba_mpi_version_belonged) { |
4884 | * In SAS3.0, | 5221 | case MPI2_VERSION: |
4885 | * SCSI_IO, SMP_PASSTHRU, SATA_PASSTHRU, Target Assist, and | 5222 | ioc->build_sg_scmd = &_base_build_sg_scmd; |
4886 | * Target Status - all require the IEEE formated scatter gather | 5223 | ioc->build_sg = &_base_build_sg; |
4887 | * elements. | 5224 | ioc->build_zero_len_sge = &_base_build_zero_len_sge; |
4888 | */ | 5225 | break; |
4889 | 5226 | case MPI25_VERSION: | |
4890 | ioc->build_sg_scmd = &_base_build_sg_scmd_ieee; | 5227 | /* |
4891 | ioc->build_sg = &_base_build_sg_ieee; | 5228 | * In SAS3.0, |
4892 | ioc->build_zero_len_sge = &_base_build_zero_len_sge_ieee; | 5229 | * SCSI_IO, SMP_PASSTHRU, SATA_PASSTHRU, Target Assist, and |
4893 | ioc->sge_size_ieee = sizeof(Mpi2IeeeSgeSimple64_t); | 5230 | * Target Status - all require the IEEE formated scatter gather |
5231 | * elements. | ||
5232 | */ | ||
5233 | ioc->build_sg_scmd = &_base_build_sg_scmd_ieee; | ||
5234 | ioc->build_sg = &_base_build_sg_ieee; | ||
5235 | ioc->build_zero_len_sge = &_base_build_zero_len_sge_ieee; | ||
5236 | ioc->sge_size_ieee = sizeof(Mpi2IeeeSgeSimple64_t); | ||
5237 | break; | ||
5238 | } | ||
4894 | 5239 | ||
4895 | /* | 5240 | /* |
4896 | * These function pointers for other requests that don't | 5241 | * These function pointers for other requests that don't |
@@ -5006,6 +5351,7 @@ mpt3sas_base_attach(struct MPT3SAS_ADAPTER *ioc) | |||
5006 | if (r) | 5351 | if (r) |
5007 | goto out_free_resources; | 5352 | goto out_free_resources; |
5008 | 5353 | ||
5354 | ioc->non_operational_loop = 0; | ||
5009 | return 0; | 5355 | return 0; |
5010 | 5356 | ||
5011 | out_free_resources: | 5357 | out_free_resources: |
@@ -5016,6 +5362,8 @@ mpt3sas_base_attach(struct MPT3SAS_ADAPTER *ioc) | |||
5016 | _base_release_memory_pools(ioc); | 5362 | _base_release_memory_pools(ioc); |
5017 | pci_set_drvdata(ioc->pdev, NULL); | 5363 | pci_set_drvdata(ioc->pdev, NULL); |
5018 | kfree(ioc->cpu_msix_table); | 5364 | kfree(ioc->cpu_msix_table); |
5365 | if (ioc->is_warpdrive) | ||
5366 | kfree(ioc->reply_post_host_index); | ||
5019 | kfree(ioc->pd_handles); | 5367 | kfree(ioc->pd_handles); |
5020 | kfree(ioc->blocking_handles); | 5368 | kfree(ioc->blocking_handles); |
5021 | kfree(ioc->tm_cmds.reply); | 5369 | kfree(ioc->tm_cmds.reply); |
@@ -5055,6 +5403,8 @@ mpt3sas_base_detach(struct MPT3SAS_ADAPTER *ioc) | |||
5055 | _base_release_memory_pools(ioc); | 5403 | _base_release_memory_pools(ioc); |
5056 | pci_set_drvdata(ioc->pdev, NULL); | 5404 | pci_set_drvdata(ioc->pdev, NULL); |
5057 | kfree(ioc->cpu_msix_table); | 5405 | kfree(ioc->cpu_msix_table); |
5406 | if (ioc->is_warpdrive) | ||
5407 | kfree(ioc->reply_post_host_index); | ||
5058 | kfree(ioc->pd_handles); | 5408 | kfree(ioc->pd_handles); |
5059 | kfree(ioc->blocking_handles); | 5409 | kfree(ioc->blocking_handles); |
5060 | kfree(ioc->pfacts); | 5410 | kfree(ioc->pfacts); |