aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/pm8001
diff options
context:
space:
mode:
authorBenjamin Rood <benjaminjrood@gmail.com>2015-10-30 10:53:24 -0400
committerMartin K. Petersen <martin.petersen@oracle.com>2015-11-02 23:33:12 -0500
commitda2dd6184b6178c12ca3d953356962a6ef5cfaff (patch)
tree9e4a595c703943480ca6addc55a650520f03b8e9 /drivers/scsi/pm8001
parentb39c9a661b9bc77e064cade26cf913a1d4255d55 (diff)
pm80xx: configure PHY settings based on subsystem vendor ID
Previuosly, all PMC Sierra 80xx controllers are assumed to be a motherboard controller, except if the subsystem vendor ID was equal to PCI_VENDOR_ID_ADAPTEC. The driver then attempts to load PHY settings from NVRAM. While this may be correct behavior for most controllers, it does not work with Adaptec and ATTO controllers since they do not store PHY settings in NVRAM and choose to use either custom PHY settings or chip defaults. Loading random values from NVRAM may cause the controllers to malfunction in this edge case. Signed-off-by: Benjamin Rood <brood@attotech.com> Reviewed-by: Jack Wang <jinpu.wang@profitbricks.com> Reviewed-by: Hannes Reinecke <hare@suse.de> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Diffstat (limited to 'drivers/scsi/pm8001')
-rw-r--r--drivers/scsi/pm8001/pm8001_init.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/drivers/scsi/pm8001/pm8001_init.c b/drivers/scsi/pm8001/pm8001_init.c
index 5c0356fb6310..8c094fd2faa1 100644
--- a/drivers/scsi/pm8001/pm8001_init.c
+++ b/drivers/scsi/pm8001/pm8001_init.c
@@ -720,6 +720,23 @@ static int pm8001_get_phy_settings_info(struct pm8001_hba_info *pm8001_ha)
720 return 0; 720 return 0;
721} 721}
722 722
723/**
724 * pm8001_configure_phy_settings : Configures PHY settings based on vendor ID.
725 * @pm8001_ha : our hba.
726 */
727static int pm8001_configure_phy_settings(struct pm8001_hba_info *pm8001_ha)
728{
729 switch (pm8001_ha->pdev->subsystem_vendor) {
730 case PCI_VENDOR_ID_ATTO:
731 case PCI_VENDOR_ID_ADAPTEC2:
732 case 0:
733 return 0;
734
735 default:
736 return pm8001_get_phy_settings_info(pm8001_ha);
737 }
738}
739
723#ifdef PM8001_USE_MSIX 740#ifdef PM8001_USE_MSIX
724/** 741/**
725 * pm8001_setup_msix - enable MSI-X interrupt 742 * pm8001_setup_msix - enable MSI-X interrupt
@@ -902,12 +919,9 @@ static int pm8001_pci_probe(struct pci_dev *pdev,
902 919
903 pm8001_init_sas_add(pm8001_ha); 920 pm8001_init_sas_add(pm8001_ha);
904 /* phy setting support for motherboard controller */ 921 /* phy setting support for motherboard controller */
905 if (pdev->subsystem_vendor != PCI_VENDOR_ID_ADAPTEC2 && 922 if (pm8001_configure_phy_settings(pm8001_ha))
906 pdev->subsystem_vendor != 0) { 923 goto err_out_shost;
907 rc = pm8001_get_phy_settings_info(pm8001_ha); 924
908 if (rc)
909 goto err_out_shost;
910 }
911 pm8001_post_sas_ha_init(shost, chip); 925 pm8001_post_sas_ha_init(shost, chip);
912 rc = sas_register_ha(SHOST_TO_SAS_HA(shost)); 926 rc = sas_register_ha(SHOST_TO_SAS_HA(shost));
913 if (rc) 927 if (rc)