diff options
Diffstat (limited to 'drivers/scsi/isci/phy.c')
-rw-r--r-- | drivers/scsi/isci/phy.c | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/drivers/scsi/isci/phy.c b/drivers/scsi/isci/phy.c index c650d3003c22..61000cde84c7 100644 --- a/drivers/scsi/isci/phy.c +++ b/drivers/scsi/isci/phy.c | |||
@@ -144,10 +144,59 @@ sci_phy_link_layer_initialization(struct isci_phy *iphy, | |||
144 | phy_cap.gen3_no_ssc = 1; | 144 | phy_cap.gen3_no_ssc = 1; |
145 | phy_cap.gen2_no_ssc = 1; | 145 | phy_cap.gen2_no_ssc = 1; |
146 | phy_cap.gen1_no_ssc = 1; | 146 | phy_cap.gen1_no_ssc = 1; |
147 | if (ihost->oem_parameters.controller.do_enable_ssc == true) { | 147 | if (ihost->oem_parameters.controller.do_enable_ssc) { |
148 | struct scu_afe_registers __iomem *afe = &ihost->scu_registers->afe; | ||
149 | struct scu_afe_transceiver *xcvr = &afe->scu_afe_xcvr[phy_idx]; | ||
150 | struct isci_pci_info *pci_info = to_pci_info(ihost->pdev); | ||
151 | bool en_sas = false; | ||
152 | bool en_sata = false; | ||
153 | u32 sas_type = 0; | ||
154 | u32 sata_spread = 0x2; | ||
155 | u32 sas_spread = 0x2; | ||
156 | |||
148 | phy_cap.gen3_ssc = 1; | 157 | phy_cap.gen3_ssc = 1; |
149 | phy_cap.gen2_ssc = 1; | 158 | phy_cap.gen2_ssc = 1; |
150 | phy_cap.gen1_ssc = 1; | 159 | phy_cap.gen1_ssc = 1; |
160 | |||
161 | if (pci_info->orom->hdr.version < ISCI_ROM_VER_1_1) | ||
162 | en_sas = en_sata = true; | ||
163 | else { | ||
164 | sata_spread = ihost->oem_parameters.controller.ssc_sata_tx_spread_level; | ||
165 | sas_spread = ihost->oem_parameters.controller.ssc_sas_tx_spread_level; | ||
166 | |||
167 | if (sata_spread) | ||
168 | en_sata = true; | ||
169 | |||
170 | if (sas_spread) { | ||
171 | en_sas = true; | ||
172 | sas_type = ihost->oem_parameters.controller.ssc_sas_tx_type; | ||
173 | } | ||
174 | |||
175 | } | ||
176 | |||
177 | if (en_sas) { | ||
178 | u32 reg; | ||
179 | |||
180 | reg = readl(&xcvr->afe_xcvr_control0); | ||
181 | reg |= (0x00100000 | (sas_type << 19)); | ||
182 | writel(reg, &xcvr->afe_xcvr_control0); | ||
183 | |||
184 | reg = readl(&xcvr->afe_tx_ssc_control); | ||
185 | reg |= sas_spread << 8; | ||
186 | writel(reg, &xcvr->afe_tx_ssc_control); | ||
187 | } | ||
188 | |||
189 | if (en_sata) { | ||
190 | u32 reg; | ||
191 | |||
192 | reg = readl(&xcvr->afe_tx_ssc_control); | ||
193 | reg |= sata_spread; | ||
194 | writel(reg, &xcvr->afe_tx_ssc_control); | ||
195 | |||
196 | reg = readl(&llr->stp_control); | ||
197 | reg |= 1 << 12; | ||
198 | writel(reg, &llr->stp_control); | ||
199 | } | ||
151 | } | 200 | } |
152 | 201 | ||
153 | /* The SAS specification indicates that the phy_capabilities that | 202 | /* The SAS specification indicates that the phy_capabilities that |