diff options
Diffstat (limited to 'drivers/scsi/mpt2sas/mpt2sas_base.c')
-rw-r--r-- | drivers/scsi/mpt2sas/mpt2sas_base.c | 85 |
1 files changed, 77 insertions, 8 deletions
diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.c b/drivers/scsi/mpt2sas/mpt2sas_base.c index 52427a8324f5..f3da592f7bcc 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_base.c +++ b/drivers/scsi/mpt2sas/mpt2sas_base.c | |||
@@ -636,6 +636,14 @@ _base_unmask_interrupts(struct MPT2SAS_ADAPTER *ioc) | |||
636 | static irqreturn_t | 636 | static irqreturn_t |
637 | _base_interrupt(int irq, void *bus_id) | 637 | _base_interrupt(int irq, void *bus_id) |
638 | { | 638 | { |
639 | union reply_descriptor { | ||
640 | u64 word; | ||
641 | struct { | ||
642 | u32 low; | ||
643 | u32 high; | ||
644 | } u; | ||
645 | }; | ||
646 | union reply_descriptor rd; | ||
639 | u32 post_index, post_index_next, completed_cmds; | 647 | u32 post_index, post_index_next, completed_cmds; |
640 | u8 request_desript_type; | 648 | u8 request_desript_type; |
641 | u16 smid; | 649 | u16 smid; |
@@ -656,7 +664,8 @@ _base_interrupt(int irq, void *bus_id) | |||
656 | 664 | ||
657 | completed_cmds = 0; | 665 | completed_cmds = 0; |
658 | do { | 666 | do { |
659 | if (ioc->reply_post_free[post_index].Words == ~0ULL) | 667 | rd.word = ioc->reply_post_free[post_index].Words; |
668 | if (rd.u.low == UINT_MAX || rd.u.high == UINT_MAX) | ||
660 | goto out; | 669 | goto out; |
661 | reply = 0; | 670 | reply = 0; |
662 | cb_idx = 0xFF; | 671 | cb_idx = 0xFF; |
@@ -721,7 +730,7 @@ _base_interrupt(int irq, void *bus_id) | |||
721 | for (i = 0 ; i < completed_cmds; i++) { | 730 | for (i = 0 ; i < completed_cmds; i++) { |
722 | post_index = post_index_next; | 731 | post_index = post_index_next; |
723 | /* poison the reply post descriptor */ | 732 | /* poison the reply post descriptor */ |
724 | ioc->reply_post_free[post_index_next].Words = ~0ULL; | 733 | ioc->reply_post_free[post_index_next].Words = ULLONG_MAX; |
725 | post_index_next = (post_index == | 734 | post_index_next = (post_index == |
726 | (ioc->reply_post_queue_depth - 1)) | 735 | (ioc->reply_post_queue_depth - 1)) |
727 | ? 0 : post_index + 1; | 736 | ? 0 : post_index + 1; |
@@ -855,9 +864,9 @@ _base_config_dma_addressing(struct MPT2SAS_ADAPTER *ioc, struct pci_dev *pdev) | |||
855 | if (sizeof(dma_addr_t) > 4) { | 864 | if (sizeof(dma_addr_t) > 4) { |
856 | const uint64_t required_mask = | 865 | const uint64_t required_mask = |
857 | dma_get_required_mask(&pdev->dev); | 866 | dma_get_required_mask(&pdev->dev); |
858 | if ((required_mask > DMA_32BIT_MASK) && !pci_set_dma_mask(pdev, | 867 | if ((required_mask > DMA_BIT_MASK(32)) && !pci_set_dma_mask(pdev, |
859 | DMA_64BIT_MASK) && !pci_set_consistent_dma_mask(pdev, | 868 | DMA_BIT_MASK(64)) && !pci_set_consistent_dma_mask(pdev, |
860 | DMA_64BIT_MASK)) { | 869 | DMA_BIT_MASK(64))) { |
861 | ioc->base_add_sg_single = &_base_add_sg_single_64; | 870 | ioc->base_add_sg_single = &_base_add_sg_single_64; |
862 | ioc->sge_size = sizeof(Mpi2SGESimple64_t); | 871 | ioc->sge_size = sizeof(Mpi2SGESimple64_t); |
863 | desc = "64"; | 872 | desc = "64"; |
@@ -865,8 +874,8 @@ _base_config_dma_addressing(struct MPT2SAS_ADAPTER *ioc, struct pci_dev *pdev) | |||
865 | } | 874 | } |
866 | } | 875 | } |
867 | 876 | ||
868 | if (!pci_set_dma_mask(pdev, DMA_32BIT_MASK) | 877 | if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) |
869 | && !pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK)) { | 878 | && !pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32))) { |
870 | ioc->base_add_sg_single = &_base_add_sg_single_32; | 879 | ioc->base_add_sg_single = &_base_add_sg_single_32; |
871 | ioc->sge_size = sizeof(Mpi2SGESimple32_t); | 880 | ioc->sge_size = sizeof(Mpi2SGESimple32_t); |
872 | desc = "32"; | 881 | desc = "32"; |
@@ -1387,6 +1396,64 @@ mpt2sas_base_put_smid_target_assist(struct MPT2SAS_ADAPTER *ioc, u16 smid, | |||
1387 | } | 1396 | } |
1388 | 1397 | ||
1389 | /** | 1398 | /** |
1399 | * _base_display_dell_branding - Disply branding string | ||
1400 | * @ioc: per adapter object | ||
1401 | * | ||
1402 | * Return nothing. | ||
1403 | */ | ||
1404 | static void | ||
1405 | _base_display_dell_branding(struct MPT2SAS_ADAPTER *ioc) | ||
1406 | { | ||
1407 | char dell_branding[MPT2SAS_DELL_BRANDING_SIZE]; | ||
1408 | |||
1409 | if (ioc->pdev->subsystem_vendor != PCI_VENDOR_ID_DELL) | ||
1410 | return; | ||
1411 | |||
1412 | memset(dell_branding, 0, MPT2SAS_DELL_BRANDING_SIZE); | ||
1413 | switch (ioc->pdev->subsystem_device) { | ||
1414 | case MPT2SAS_DELL_6GBPS_SAS_HBA_SSDID: | ||
1415 | strncpy(dell_branding, MPT2SAS_DELL_6GBPS_SAS_HBA_BRANDING, | ||
1416 | MPT2SAS_DELL_BRANDING_SIZE - 1); | ||
1417 | break; | ||
1418 | case MPT2SAS_DELL_PERC_H200_ADAPTER_SSDID: | ||
1419 | strncpy(dell_branding, MPT2SAS_DELL_PERC_H200_ADAPTER_BRANDING, | ||
1420 | MPT2SAS_DELL_BRANDING_SIZE - 1); | ||
1421 | break; | ||
1422 | case MPT2SAS_DELL_PERC_H200_INTEGRATED_SSDID: | ||
1423 | strncpy(dell_branding, | ||
1424 | MPT2SAS_DELL_PERC_H200_INTEGRATED_BRANDING, | ||
1425 | MPT2SAS_DELL_BRANDING_SIZE - 1); | ||
1426 | break; | ||
1427 | case MPT2SAS_DELL_PERC_H200_MODULAR_SSDID: | ||
1428 | strncpy(dell_branding, | ||
1429 | MPT2SAS_DELL_PERC_H200_MODULAR_BRANDING, | ||
1430 | MPT2SAS_DELL_BRANDING_SIZE - 1); | ||
1431 | break; | ||
1432 | case MPT2SAS_DELL_PERC_H200_EMBEDDED_SSDID: | ||
1433 | strncpy(dell_branding, | ||
1434 | MPT2SAS_DELL_PERC_H200_EMBEDDED_BRANDING, | ||
1435 | MPT2SAS_DELL_BRANDING_SIZE - 1); | ||
1436 | break; | ||
1437 | case MPT2SAS_DELL_PERC_H200_SSDID: | ||
1438 | strncpy(dell_branding, MPT2SAS_DELL_PERC_H200_BRANDING, | ||
1439 | MPT2SAS_DELL_BRANDING_SIZE - 1); | ||
1440 | break; | ||
1441 | case MPT2SAS_DELL_6GBPS_SAS_SSDID: | ||
1442 | strncpy(dell_branding, MPT2SAS_DELL_6GBPS_SAS_BRANDING, | ||
1443 | MPT2SAS_DELL_BRANDING_SIZE - 1); | ||
1444 | break; | ||
1445 | default: | ||
1446 | sprintf(dell_branding, "0x%4X", ioc->pdev->subsystem_device); | ||
1447 | break; | ||
1448 | } | ||
1449 | |||
1450 | printk(MPT2SAS_INFO_FMT "%s: Vendor(0x%04X), Device(0x%04X)," | ||
1451 | " SSVID(0x%04X), SSDID(0x%04X)\n", ioc->name, dell_branding, | ||
1452 | ioc->pdev->vendor, ioc->pdev->device, ioc->pdev->subsystem_vendor, | ||
1453 | ioc->pdev->subsystem_device); | ||
1454 | } | ||
1455 | |||
1456 | /** | ||
1390 | * _base_display_ioc_capabilities - Disply IOC's capabilities. | 1457 | * _base_display_ioc_capabilities - Disply IOC's capabilities. |
1391 | * @ioc: per adapter object | 1458 | * @ioc: per adapter object |
1392 | * | 1459 | * |
@@ -1427,6 +1494,8 @@ _base_display_ioc_capabilities(struct MPT2SAS_ADAPTER *ioc) | |||
1427 | i++; | 1494 | i++; |
1428 | } | 1495 | } |
1429 | 1496 | ||
1497 | _base_display_dell_branding(ioc); | ||
1498 | |||
1430 | i = 0; | 1499 | i = 0; |
1431 | printk("), "); | 1500 | printk("), "); |
1432 | printk("Capabilities=("); | 1501 | printk("Capabilities=("); |
@@ -3068,7 +3137,7 @@ _base_make_ioc_operational(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID, | |||
3068 | 3137 | ||
3069 | /* initialize Reply Post Free Queue */ | 3138 | /* initialize Reply Post Free Queue */ |
3070 | for (i = 0; i < ioc->reply_post_queue_depth; i++) | 3139 | for (i = 0; i < ioc->reply_post_queue_depth; i++) |
3071 | ioc->reply_post_free[i].Words = ~0ULL; | 3140 | ioc->reply_post_free[i].Words = ULLONG_MAX; |
3072 | 3141 | ||
3073 | r = _base_send_ioc_init(ioc, VF_ID, sleep_flag); | 3142 | r = _base_send_ioc_init(ioc, VF_ID, sleep_flag); |
3074 | if (r) | 3143 | if (r) |