diff options
Diffstat (limited to 'drivers/scsi/isci/phy.c')
| -rw-r--r-- | drivers/scsi/isci/phy.c | 13 | 
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/scsi/isci/phy.c b/drivers/scsi/isci/phy.c index 79313a7a235..430fc8ff014 100644 --- a/drivers/scsi/isci/phy.c +++ b/drivers/scsi/isci/phy.c @@ -104,6 +104,7 @@ sci_phy_link_layer_initialization(struct isci_phy *iphy,  	u32 parity_count = 0;  	u32 llctl, link_rate;  	u32 clksm_value = 0; +	u32 sp_timeouts = 0;  	iphy->link_layer_registers = reg; @@ -211,6 +212,18 @@ sci_phy_link_layer_initialization(struct isci_phy *iphy,  	llctl |= SCU_SAS_LLCTL_GEN_VAL(MAX_LINK_RATE, link_rate);  	writel(llctl, &iphy->link_layer_registers->link_layer_control); +	sp_timeouts = readl(&iphy->link_layer_registers->sas_phy_timeouts); + +	/* Clear the default 0x36 (54us) RATE_CHANGE timeout value. */ +	sp_timeouts &= ~SCU_SAS_PHYTOV_GEN_VAL(RATE_CHANGE, 0xFF); + +	/* Set RATE_CHANGE timeout value to 0x3B (59us).  This ensures SCU can +	 * lock with 3Gb drive when SCU max rate is set to 1.5Gb. +	 */ +	sp_timeouts |= SCU_SAS_PHYTOV_GEN_VAL(RATE_CHANGE, 0x3B); + +	writel(sp_timeouts, &iphy->link_layer_registers->sas_phy_timeouts); +  	if (is_a2(ihost->pdev)) {  		/* Program the max ARB time for the PHY to 700us so we inter-operate with  		 * the PMC expander which shuts down PHYs if the expander PHY generates too  |