aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/mpt3sas/mpt3sas_base.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/mpt3sas/mpt3sas_base.c')
-rw-r--r--drivers/scsi/mpt3sas/mpt3sas_base.c668
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}
116module_param_call(mpt3sas_fwfault_debug, _scsih_set_fwfault_debug, 119module_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 */
1366static 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 */
2326static void 2520static 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;
2375static 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,
2409static 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);