Skip to content

Commit dc00c8b

Browse files
committed
isci: cleanup silicon revision detection
Perform checking per-pci device (even though all systems will only have 1 pci device in this generation), and delete support for silicon that does not report a proper revision (i.e. A0). Reported-by: Christoph Hellwig <[email protected]> Signed-off-by: Dan Williams <[email protected]>
1 parent 4e4dca3 commit dc00c8b

File tree

5 files changed

+31
-73
lines changed

5 files changed

+31
-73
lines changed

drivers/scsi/isci/host.c

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1886,32 +1886,31 @@ void sci_controller_power_control_queue_remove(struct isci_host *ihost,
18861886
static void sci_controller_afe_initialization(struct isci_host *ihost)
18871887
{
18881888
const struct sci_oem_params *oem = &ihost->oem_parameters;
1889+
struct pci_dev *pdev = ihost->pdev;
18891890
u32 afe_status;
18901891
u32 phy_id;
18911892

18921893
/* Clear DFX Status registers */
18931894
writel(0x0081000f, &ihost->scu_registers->afe.afe_dfx_master_control0);
18941895
udelay(AFE_REGISTER_WRITE_DELAY);
18951896

1896-
if (is_b0()) {
1897+
if (is_b0(pdev)) {
18971898
/* PM Rx Equalization Save, PM SPhy Rx Acknowledgement
18981899
* Timer, PM Stagger Timer */
18991900
writel(0x0007BFFF, &ihost->scu_registers->afe.afe_pmsn_master_control2);
19001901
udelay(AFE_REGISTER_WRITE_DELAY);
19011902
}
19021903

19031904
/* Configure bias currents to normal */
1904-
if (is_a0())
1905-
writel(0x00005500, &ihost->scu_registers->afe.afe_bias_control);
1906-
else if (is_a2())
1905+
if (is_a2(pdev))
19071906
writel(0x00005A00, &ihost->scu_registers->afe.afe_bias_control);
1908-
else if (is_b0() || is_c0())
1907+
else if (is_b0(pdev) || is_c0(pdev))
19091908
writel(0x00005F00, &ihost->scu_registers->afe.afe_bias_control);
19101909

19111910
udelay(AFE_REGISTER_WRITE_DELAY);
19121911

19131912
/* Enable PLL */
1914-
if (is_b0() || is_c0())
1913+
if (is_b0(pdev) || is_c0(pdev))
19151914
writel(0x80040A08, &ihost->scu_registers->afe.afe_pll_control0);
19161915
else
19171916
writel(0x80040908, &ihost->scu_registers->afe.afe_pll_control0);
@@ -1924,7 +1923,7 @@ static void sci_controller_afe_initialization(struct isci_host *ihost)
19241923
udelay(AFE_REGISTER_WRITE_DELAY);
19251924
} while ((afe_status & 0x00001000) == 0);
19261925

1927-
if (is_a0() || is_a2()) {
1926+
if (is_a2(pdev)) {
19281927
/* Shorten SAS SNW lock time (RxLock timer value from 76 us to 50 us) */
19291928
writel(0x7bcc96ad, &ihost->scu_registers->afe.afe_pmsn_master_control0);
19301929
udelay(AFE_REGISTER_WRITE_DELAY);
@@ -1933,11 +1932,11 @@ static void sci_controller_afe_initialization(struct isci_host *ihost)
19331932
for (phy_id = 0; phy_id < SCI_MAX_PHYS; phy_id++) {
19341933
const struct sci_phy_oem_params *oem_phy = &oem->phys[phy_id];
19351934

1936-
if (is_b0()) {
1935+
if (is_b0(pdev)) {
19371936
/* Configure transmitter SSC parameters */
19381937
writel(0x00030000, &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_tx_ssc_control);
19391938
udelay(AFE_REGISTER_WRITE_DELAY);
1940-
} else if (is_c0()) {
1939+
} else if (is_c0(pdev)) {
19411940
/* Configure transmitter SSC parameters */
19421941
writel(0x0003000, &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_tx_ssc_control);
19431942
udelay(AFE_REGISTER_WRITE_DELAY);
@@ -1961,11 +1960,9 @@ static void sci_controller_afe_initialization(struct isci_host *ihost)
19611960
/*
19621961
* Power up TX and RX out from power down (PWRDNTX and PWRDNRX)
19631962
* & increase TX int & ext bias 20%....(0xe85c) */
1964-
if (is_a0())
1965-
writel(0x000003D4, &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_channel_control);
1966-
else if (is_a2())
1963+
if (is_a2(pdev))
19671964
writel(0x000003F0, &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_channel_control);
1968-
else if (is_b0()) {
1965+
else if (is_b0(pdev)) {
19691966
/* Power down TX and RX (PWRDNTX and PWRDNRX) */
19701967
writel(0x000003D7, &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_channel_control);
19711968
udelay(AFE_REGISTER_WRITE_DELAY);
@@ -1985,7 +1982,7 @@ static void sci_controller_afe_initialization(struct isci_host *ihost)
19851982
}
19861983
udelay(AFE_REGISTER_WRITE_DELAY);
19871984

1988-
if (is_a0() || is_a2()) {
1985+
if (is_a2(pdev)) {
19891986
/* Enable TX equalization (0xe824) */
19901987
writel(0x00040000, &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_tx_control);
19911988
udelay(AFE_REGISTER_WRITE_DELAY);
@@ -1998,11 +1995,9 @@ static void sci_controller_afe_initialization(struct isci_host *ihost)
19981995
udelay(AFE_REGISTER_WRITE_DELAY);
19991996

20001997
/* Leave DFE/FFE on */
2001-
if (is_a0())
2002-
writel(0x3F09983F, &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_rx_ssc_control0);
2003-
else if (is_a2())
1998+
if (is_a2(pdev))
20041999
writel(0x3F11103F, &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_rx_ssc_control0);
2005-
else if (is_b0()) {
2000+
else if (is_b0(pdev)) {
20062001
writel(0x3F11103F, &ihost->scu_registers->afe.scu_afe_xcvr[phy_id].afe_rx_ssc_control0);
20072002
udelay(AFE_REGISTER_WRITE_DELAY);
20082003
/* Enable TX equalization (0xe824) */

drivers/scsi/isci/host.h

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -416,33 +416,25 @@ static inline struct device *scirdev_to_dev(struct isci_remote_device *idev)
416416
return &idev->isci_port->isci_host->pdev->dev;
417417
}
418418

419-
enum {
420-
ISCI_SI_REVA0,
421-
ISCI_SI_REVA2,
422-
ISCI_SI_REVB0,
423-
ISCI_SI_REVC0
424-
};
425-
426-
extern int isci_si_rev;
427-
428-
static inline bool is_a0(void)
429-
{
430-
return isci_si_rev == ISCI_SI_REVA0;
431-
}
432-
433-
static inline bool is_a2(void)
419+
static inline bool is_a2(struct pci_dev *pdev)
434420
{
435-
return isci_si_rev == ISCI_SI_REVA2;
421+
if (pdev->revision < 4)
422+
return true;
423+
return false;
436424
}
437425

438-
static inline bool is_b0(void)
426+
static inline bool is_b0(struct pci_dev *pdev)
439427
{
440-
return isci_si_rev == ISCI_SI_REVB0;
428+
if (pdev->revision == 4)
429+
return true;
430+
return false;
441431
}
442432

443-
static inline bool is_c0(void)
433+
static inline bool is_c0(struct pci_dev *pdev)
444434
{
445-
return isci_si_rev > ISCI_SI_REVB0;
435+
if (pdev->revision >= 5)
436+
return true;
437+
return false;
446438
}
447439

448440
void sci_controller_post_request(struct isci_host *ihost,

drivers/scsi/isci/init.c

Lines changed: 2 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,6 @@ MODULE_DEVICE_TABLE(pci, isci_id_table);
8585

8686
/* linux isci specific settings */
8787

88-
int isci_si_rev = ISCI_SI_REVA2;
89-
module_param(isci_si_rev, int, 0);
90-
MODULE_PARM_DESC(isci_si_rev, "(deprecated) override default si rev (0: A0 1: A2 2: B0)");
91-
9288
unsigned char no_outbound_task_to = 20;
9389
module_param(no_outbound_task_to, byte, 0);
9490
MODULE_PARM_DESC(no_outbound_task_to, "No Outbound Task Timeout (1us incr)");
@@ -435,32 +431,6 @@ static struct isci_host *isci_host_alloc(struct pci_dev *pdev, int id)
435431
return NULL;
436432
}
437433

438-
static void check_si_rev(struct pci_dev *pdev)
439-
{
440-
switch (pdev->revision) {
441-
case 0:
442-
case 1:
443-
/* if the id is ambiguous don't update isci_si_rev */
444-
break;
445-
case 3:
446-
isci_si_rev = ISCI_SI_REVA2;
447-
break;
448-
case 4:
449-
isci_si_rev = ISCI_SI_REVB0;
450-
break;
451-
default:
452-
case 5:
453-
isci_si_rev = ISCI_SI_REVC0;
454-
break;
455-
}
456-
457-
dev_info(&pdev->dev, "driver configured for %s silicon (rev: %d)\n",
458-
isci_si_rev == ISCI_SI_REVA0 ? "A0" :
459-
isci_si_rev == ISCI_SI_REVA2 ? "A2" :
460-
isci_si_rev == ISCI_SI_REVB0 ? "B0" : "C0", pdev->revision);
461-
462-
}
463-
464434
static int __devinit isci_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
465435
{
466436
struct isci_pci_info *pci_info;
@@ -470,7 +440,8 @@ static int __devinit isci_pci_probe(struct pci_dev *pdev, const struct pci_devic
470440
struct isci_orom *orom = NULL;
471441
char *source = "(platform)";
472442

473-
check_si_rev(pdev);
443+
dev_info(&pdev->dev, "driver configured for rev: %d silicon\n",
444+
pdev->revision);
474445

475446
pci_info = devm_kzalloc(&pdev->dev, sizeof(*pci_info), GFP_KERNEL);
476447
if (!pci_info)

drivers/scsi/isci/phy.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ sci_phy_link_layer_initialization(struct isci_phy *iphy,
211211
llctl |= SCU_SAS_LLCTL_GEN_VAL(MAX_LINK_RATE, link_rate);
212212
writel(llctl, &iphy->link_layer_registers->link_layer_control);
213213

214-
if (is_a0() || is_a2()) {
214+
if (is_a2(ihost->pdev)) {
215215
/* Program the max ARB time for the PHY to 700us so we inter-operate with
216216
* the PMC expander which shuts down PHYs if the expander PHY generates too
217217
* many breaks. This time value will guarantee that the initiator PHY will

drivers/scsi/isci/probe_roms.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -146,13 +146,13 @@ struct isci_orom *isci_request_firmware(struct pci_dev *pdev, const struct firmw
146146

147147
memcpy(orom, fw->data, fw->size);
148148

149+
if (is_c0(pdev))
150+
goto out;
151+
149152
/*
150153
* deprecated: override default amp_control for pre-preproduction
151154
* silicon revisions
152155
*/
153-
if (isci_si_rev <= ISCI_SI_REVB0)
154-
goto out;
155-
156156
for (i = 0; i < ARRAY_SIZE(orom->ctrl); i++)
157157
for (j = 0; j < ARRAY_SIZE(orom->ctrl[i].phys); j++) {
158158
orom->ctrl[i].phys[j].afe_tx_amp_control0 = 0xe7c03;

0 commit comments

Comments
 (0)