Skip to content

Commit 3e253d9

Browse files
peter changmartinkpetersen
authored andcommitted
scsi: pm80xx: Do not request 12G sas speeds
Occasionally, 6G capable drives fail to train at 6G on links that look good from a signal-integrity perspective. PMC suggests configuring the port to not even expect 12G. Link: https://lore.kernel.org/r/[email protected] Acked-by: Jack Wang <[email protected]> Signed-off-by: peter chang <[email protected]> Signed-off-by: Deepak Ukey <[email protected]> Signed-off-by: Viswas G <[email protected]> Signed-off-by: Martin K. Petersen <[email protected]>
1 parent 51c1c5f commit 3e253d9

File tree

3 files changed

+22
-17
lines changed

3 files changed

+22
-17
lines changed

drivers/scsi/pm8001/pm8001_init.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,20 @@
4141
#include <linux/slab.h>
4242
#include "pm8001_sas.h"
4343
#include "pm8001_chips.h"
44+
#include "pm80xx_hwi.h"
4445

4546
static ulong logging_level = PM8001_FAIL_LOGGING | PM8001_IOERR_LOGGING;
4647
module_param(logging_level, ulong, 0644);
4748
MODULE_PARM_DESC(logging_level, " bits for enabling logging info.");
4849

50+
static ulong link_rate = LINKRATE_15 | LINKRATE_30 | LINKRATE_60 | LINKRATE_120;
51+
module_param(link_rate, ulong, 0644);
52+
MODULE_PARM_DESC(link_rate, "Enable link rate.\n"
53+
" 1: Link rate 1.5G\n"
54+
" 2: Link rate 3.0G\n"
55+
" 4: Link rate 6.0G\n"
56+
" 8: Link rate 12.0G\n");
57+
4958
static struct scsi_transport_template *pm8001_stt;
5059

5160
/**
@@ -471,6 +480,14 @@ static struct pm8001_hba_info *pm8001_pci_alloc(struct pci_dev *pdev,
471480
pm8001_ha->shost = shost;
472481
pm8001_ha->id = pm8001_id++;
473482
pm8001_ha->logging_level = logging_level;
483+
if (link_rate >= 1 && link_rate <= 15)
484+
pm8001_ha->link_rate = (link_rate << 8);
485+
else {
486+
pm8001_ha->link_rate = LINKRATE_15 | LINKRATE_30 |
487+
LINKRATE_60 | LINKRATE_120;
488+
PM8001_FAIL_DBG(pm8001_ha, pm8001_printk(
489+
"Setting link rate to default value\n"));
490+
}
474491
sprintf(pm8001_ha->name, "%s%d", DRV_NAME, pm8001_ha->id);
475492
/* IOMB size is 128 for 8088/89 controllers */
476493
if (pm8001_ha->chip_id != chip_8001)

drivers/scsi/pm8001/pm8001_sas.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,7 @@ struct pm8001_hba_info {
546546
struct tasklet_struct tasklet[PM8001_MAX_MSIX_VEC];
547547
#endif
548548
u32 logging_level;
549+
u32 link_rate;
549550
u32 fw_status;
550551
u32 smp_exp_mode;
551552
bool controller_fatal_error;

drivers/scsi/pm8001/pm80xx_hwi.c

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
* POSSIBILITY OF SUCH DAMAGES.
3838
*
3939
*/
40+
#include <linux/version.h>
4041
#include <linux/slab.h>
4142
#include "pm8001_sas.h"
4243
#include "pm80xx_hwi.h"
@@ -4565,23 +4566,9 @@ pm80xx_chip_phy_start_req(struct pm8001_hba_info *pm8001_ha, u8 phy_id)
45654566

45664567
PM8001_INIT_DBG(pm8001_ha,
45674568
pm8001_printk("PHY START REQ for phy_id %d\n", phy_id));
4568-
/*
4569-
** [0:7] PHY Identifier
4570-
** [8:11] link rate 1.5G, 3G, 6G
4571-
** [12:13] link mode 01b SAS mode; 10b SATA mode; 11b Auto mode
4572-
** [14] 0b disable spin up hold; 1b enable spin up hold
4573-
** [15] ob no change in current PHY analig setup 1b enable using SPAST
4574-
*/
4575-
if (!IS_SPCV_12G(pm8001_ha->pdev))
4576-
payload.ase_sh_lm_slr_phyid = cpu_to_le32(SPINHOLD_DISABLE |
4577-
LINKMODE_AUTO | LINKRATE_15 |
4578-
LINKRATE_30 | LINKRATE_60 | phy_id);
4579-
else
4580-
payload.ase_sh_lm_slr_phyid = cpu_to_le32(SPINHOLD_DISABLE |
4581-
LINKMODE_AUTO | LINKRATE_15 |
4582-
LINKRATE_30 | LINKRATE_60 | LINKRATE_120 |
4583-
phy_id);
45844569

4570+
payload.ase_sh_lm_slr_phyid = cpu_to_le32(SPINHOLD_DISABLE |
4571+
LINKMODE_AUTO | pm8001_ha->link_rate | phy_id);
45854572
/* SSC Disable and SAS Analog ST configuration */
45864573
/**
45874574
payload.ase_sh_lm_slr_phyid =
@@ -4594,7 +4581,7 @@ pm80xx_chip_phy_start_req(struct pm8001_hba_info *pm8001_ha, u8 phy_id)
45944581
payload.sas_identify.dev_type = SAS_END_DEVICE;
45954582
payload.sas_identify.initiator_bits = SAS_PROTOCOL_ALL;
45964583
memcpy(payload.sas_identify.sas_addr,
4597-
&pm8001_ha->phy[phy_id].dev_sas_addr, SAS_ADDR_SIZE);
4584+
&pm8001_ha->sas_addr, SAS_ADDR_SIZE);
45984585
payload.sas_identify.phy_id = phy_id;
45994586
ret = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opcode, &payload,
46004587
sizeof(payload), 0);

0 commit comments

Comments
 (0)