Skip to content

Commit 1fc0ff5

Browse files
committed
Merge: Merge tag 'kernel-6.12.0-124.5.1.el10_1' into main
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-10/-/merge_requests/1540 JIRA: INTERNAL Upstream Status: RHEL only Omit changes to Makefile.rhelver, and 10.1 KABI changes. Signed-off-by: Jan Stancek <jstancek@redhat.com> Merged-by: Scott Weaver <scweaver@redhat.com>
2 parents 3e7b609 + c2b671e commit 1fc0ff5

File tree

13 files changed

+1875
-31
lines changed

13 files changed

+1875
-31
lines changed

drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1799,7 +1799,10 @@ void cxgb4_remove_tid(struct tid_info *t, unsigned int chan, unsigned int tid,
17991799
struct adapter *adap = container_of(t, struct adapter, tids);
18001800
struct sk_buff *skb;
18011801

1802-
WARN_ON(tid_out_of_range(&adap->tids, tid));
1802+
if (tid_out_of_range(&adap->tids, tid)) {
1803+
dev_err(adap->pdev_dev, "tid %d out of range\n", tid);
1804+
return;
1805+
}
18031806

18041807
if (t->tid_tab[tid - adap->tids.tid_base]) {
18051808
t->tid_tab[tid - adap->tids.tid_base] = NULL;

drivers/scsi/mpi3mr/mpi/mpi30_cnfg.h

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,9 @@ struct mpi3_man6_gpio_entry {
322322
#define MPI3_MAN6_GPIO_EXTINT_PARAM1_FLAGS_TRIGGER_MASK (0x01)
323323
#define MPI3_MAN6_GPIO_EXTINT_PARAM1_FLAGS_TRIGGER_EDGE (0x00)
324324
#define MPI3_MAN6_GPIO_EXTINT_PARAM1_FLAGS_TRIGGER_LEVEL (0x01)
325+
#define MPI3_MAN6_GPIO_OVER_TEMP_PARAM1_LEVEL_WARNING (0x00)
326+
#define MPI3_MAN6_GPIO_OVER_TEMP_PARAM1_LEVEL_CRITICAL (0x01)
327+
#define MPI3_MAN6_GPIO_OVER_TEMP_PARAM1_LEVEL_FATAL (0x02)
325328
#define MPI3_MAN6_GPIO_PORT_GREEN_PARAM1_PHY_STATUS_ALL_UP (0x00)
326329
#define MPI3_MAN6_GPIO_PORT_GREEN_PARAM1_PHY_STATUS_ONE_OR_MORE_UP (0x01)
327330
#define MPI3_MAN6_GPIO_CABLE_MGMT_PARAM1_INTERFACE_MODULE_PRESENT (0x00)
@@ -1250,6 +1253,37 @@ struct mpi3_io_unit_page17 {
12501253
__le32 current_key[];
12511254
};
12521255
#define MPI3_IOUNIT17_PAGEVERSION (0x00)
1256+
struct mpi3_io_unit_page18 {
1257+
struct mpi3_config_page_header header;
1258+
u8 flags;
1259+
u8 poll_interval;
1260+
__le16 reserved0a;
1261+
__le32 reserved0c;
1262+
};
1263+
1264+
#define MPI3_IOUNIT18_PAGEVERSION (0x00)
1265+
#define MPI3_IOUNIT18_FLAGS_DIRECTATTACHED_ENABLE (0x01)
1266+
#define MPI3_IOUNIT18_POLLINTERVAL_DISABLE (0x00)
1267+
#ifndef MPI3_IOUNIT19_DEVICE_MAX
1268+
#define MPI3_IOUNIT19_DEVICE_MAX (1)
1269+
#endif
1270+
struct mpi3_iounit19_device {
1271+
__le16 temperature;
1272+
__le16 dev_handle;
1273+
__le16 persistent_id;
1274+
__le16 reserved06;
1275+
};
1276+
1277+
#define MPI3_IOUNIT19_DEVICE_TEMPERATURE_UNAVAILABLE (0x8000)
1278+
struct mpi3_io_unit_page19 {
1279+
struct mpi3_config_page_header header;
1280+
__le16 num_devices;
1281+
__le16 reserved0a;
1282+
__le32 reserved0c;
1283+
struct mpi3_iounit19_device device[MPI3_IOUNIT19_DEVICE_MAX];
1284+
};
1285+
1286+
#define MPI3_IOUNIT19_PAGEVERSION (0x00)
12531287
struct mpi3_ioc_page0 {
12541288
struct mpi3_config_page_header header;
12551289
__le32 reserved08;
@@ -2356,7 +2390,9 @@ struct mpi3_device0_vd_format {
23562390
__le16 io_throttle_group;
23572391
__le16 io_throttle_group_low;
23582392
__le16 io_throttle_group_high;
2359-
__le32 reserved0c;
2393+
u8 vd_abort_to;
2394+
u8 vd_reset_to;
2395+
__le16 reserved0e;
23602396
};
23612397
#define MPI3_DEVICE0_VD_STATE_OFFLINE (0x00)
23622398
#define MPI3_DEVICE0_VD_STATE_PARTIALLY_DEGRADED (0x01)

drivers/scsi/mpi3mr/mpi/mpi30_pci.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99
#define MPI3_NVME_ENCAP_CMD_MAX (1)
1010
#endif
1111
#define MPI3_NVME_FLAGS_FORCE_ADMIN_ERR_REPLY_MASK (0x0002)
12+
#define MPI3_NVME_FLAGS_FORCE_ADMIN_ERR_REPLY_SHIFT (1)
1213
#define MPI3_NVME_FLAGS_FORCE_ADMIN_ERR_REPLY_FAIL_ONLY (0x0000)
1314
#define MPI3_NVME_FLAGS_FORCE_ADMIN_ERR_REPLY_ALL (0x0002)
1415
#define MPI3_NVME_FLAGS_SUBMISSIONQ_MASK (0x0001)
16+
#define MPI3_NVME_FLAGS_SUBMISSIONQ_SHIFT (0)
1517
#define MPI3_NVME_FLAGS_SUBMISSIONQ_IO (0x0000)
1618
#define MPI3_NVME_FLAGS_SUBMISSIONQ_ADMIN (0x0001)
1719

drivers/scsi/mpi3mr/mpi/mpi30_sas.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#define MPI3_SAS_DEVICE_INFO_STP_INITIATOR (0x00000010)
1212
#define MPI3_SAS_DEVICE_INFO_SMP_INITIATOR (0x00000008)
1313
#define MPI3_SAS_DEVICE_INFO_DEVICE_TYPE_MASK (0x00000007)
14+
#define MPI3_SAS_DEVICE_INFO_DEVICE_TYPE_SHIFT (0)
1415
#define MPI3_SAS_DEVICE_INFO_DEVICE_TYPE_NO_DEVICE (0x00000000)
1516
#define MPI3_SAS_DEVICE_INFO_DEVICE_TYPE_END_DEVICE (0x00000001)
1617
#define MPI3_SAS_DEVICE_INFO_DEVICE_TYPE_EXPANDER (0x00000002)

drivers/scsi/mpi3mr/mpi/mpi30_transport.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ union mpi3_version_union {
1818

1919
#define MPI3_VERSION_MAJOR (3)
2020
#define MPI3_VERSION_MINOR (0)
21-
#define MPI3_VERSION_UNIT (35)
21+
#define MPI3_VERSION_UNIT (37)
2222
#define MPI3_VERSION_DEV (0)
2323
#define MPI3_DEVHANDLE_INVALID (0xffff)
2424
struct mpi3_sysif_oper_queue_indexes {

drivers/scsi/mpi3mr/mpi3mr.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ extern struct list_head mrioc_list;
5656
extern int prot_mask;
5757
extern atomic64_t event_counter;
5858

59-
#define MPI3MR_DRIVER_VERSION "8.13.0.5.50"
60-
#define MPI3MR_DRIVER_RELDATE "20-February-2025"
59+
#define MPI3MR_DRIVER_VERSION "8.15.0.5.50"
60+
#define MPI3MR_DRIVER_RELDATE "12-August-2025"
6161

6262
#define MPI3MR_DRIVER_NAME "mpi3mr"
6363
#define MPI3MR_DRIVER_LICENSE "GPL"
@@ -697,6 +697,8 @@ struct tgt_dev_vd {
697697
u16 tg_id;
698698
u32 tg_high;
699699
u32 tg_low;
700+
u8 abort_to;
701+
u8 reset_to;
700702
struct mpi3mr_throttle_group_info *tg;
701703
};
702704

@@ -738,6 +740,8 @@ enum mpi3mr_dev_state {
738740
* @wwid: World wide ID
739741
* @enclosure_logical_id: Enclosure logical identifier
740742
* @dev_spec: Device type specific information
743+
* @abort_to: Timeout for abort TM
744+
* @reset_to: Timeout for Target/LUN reset TM
741745
* @ref_count: Reference count
742746
* @state: device state
743747
*/
@@ -1137,6 +1141,8 @@ struct scmd_priv {
11371141
* @logdata_buf: Circular buffer to store log data entries
11381142
* @logdata_buf_idx: Index of entry in buffer to store
11391143
* @logdata_entry_sz: log data entry size
1144+
* @adm_req_q_bar_writeq_lock: Admin request queue lock
1145+
* @adm_reply_q_bar_writeq_lock: Admin reply queue lock
11401146
* @pend_large_data_sz: Counter to track pending large data
11411147
* @io_throttle_data_length: I/O size to track in 512b blocks
11421148
* @io_throttle_high: I/O size to start throttle in 512b blocks
@@ -1339,6 +1345,8 @@ struct mpi3mr_ioc {
13391345
u8 *logdata_buf;
13401346
u16 logdata_buf_idx;
13411347
u16 logdata_entry_sz;
1348+
spinlock_t adm_req_q_bar_writeq_lock;
1349+
spinlock_t adm_reply_q_bar_writeq_lock;
13421350

13431351
atomic_t pend_large_data_sz;
13441352
u32 io_throttle_data_length;

drivers/scsi/mpi3mr/mpi3mr_fw.c

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,22 @@ module_param(poll_queues, int, 0444);
2323
MODULE_PARM_DESC(poll_queues, "Number of queues for io_uring poll mode. (Range 1 - 126)");
2424

2525
#if defined(writeq) && defined(CONFIG_64BIT)
26-
static inline void mpi3mr_writeq(__u64 b, volatile void __iomem *addr)
26+
static inline void mpi3mr_writeq(__u64 b, volatile void __iomem *addr,
27+
spinlock_t *write_queue_lock)
2728
{
2829
writeq(b, addr);
2930
}
3031
#else
31-
static inline void mpi3mr_writeq(__u64 b, volatile void __iomem *addr)
32+
static inline void mpi3mr_writeq(__u64 b, volatile void __iomem *addr,
33+
spinlock_t *write_queue_lock)
3234
{
3335
__u64 data_out = b;
36+
unsigned long flags;
3437

38+
spin_lock_irqsave(write_queue_lock, flags);
3539
writel((u32)(data_out), addr);
3640
writel((u32)(data_out >> 32), (addr + 4));
41+
spin_unlock_irqrestore(write_queue_lock, flags);
3742
}
3843
#endif
3944

@@ -428,8 +433,8 @@ static void mpi3mr_process_admin_reply_desc(struct mpi3mr_ioc *mrioc,
428433
MPI3MR_SENSE_BUF_SZ);
429434
}
430435
if (cmdptr->is_waiting) {
431-
complete(&cmdptr->done);
432436
cmdptr->is_waiting = 0;
437+
complete(&cmdptr->done);
433438
} else if (cmdptr->callback)
434439
cmdptr->callback(mrioc, cmdptr);
435440
}
@@ -2348,6 +2353,8 @@ static int mpi3mr_create_op_queues(struct mpi3mr_ioc *mrioc)
23482353
{
23492354
int retval = 0;
23502355
u16 num_queues = 0, i = 0, msix_count_op_q = 1;
2356+
u32 ioc_status;
2357+
enum mpi3mr_iocstate ioc_state;
23512358

23522359
num_queues = min_t(int, mrioc->facts.max_op_reply_q,
23532360
mrioc->facts.max_op_req_q);
@@ -2403,6 +2410,14 @@ static int mpi3mr_create_op_queues(struct mpi3mr_ioc *mrioc)
24032410
retval = -1;
24042411
goto out_failed;
24052412
}
2413+
ioc_status = readl(&mrioc->sysif_regs->ioc_status);
2414+
ioc_state = mpi3mr_get_iocstate(mrioc);
2415+
if ((ioc_status & MPI3_SYSIF_IOC_STATUS_RESET_HISTORY) ||
2416+
ioc_state != MRIOC_STATE_READY) {
2417+
mpi3mr_print_fault_info(mrioc);
2418+
retval = -1;
2419+
goto out_failed;
2420+
}
24062421
mrioc->num_op_reply_q = mrioc->num_op_req_q = i;
24072422
ioc_info(mrioc,
24082423
"successfully created %d operational queue pairs(default/polled) queue = (%d/%d)\n",
@@ -2954,9 +2969,11 @@ static int mpi3mr_setup_admin_qpair(struct mpi3mr_ioc *mrioc)
29542969
(mrioc->num_admin_req);
29552970
writel(num_admin_entries, &mrioc->sysif_regs->admin_queue_num_entries);
29562971
mpi3mr_writeq(mrioc->admin_req_dma,
2957-
&mrioc->sysif_regs->admin_request_queue_address);
2972+
&mrioc->sysif_regs->admin_request_queue_address,
2973+
&mrioc->adm_req_q_bar_writeq_lock);
29582974
mpi3mr_writeq(mrioc->admin_reply_dma,
2959-
&mrioc->sysif_regs->admin_reply_queue_address);
2975+
&mrioc->sysif_regs->admin_reply_queue_address,
2976+
&mrioc->adm_reply_q_bar_writeq_lock);
29602977
writel(mrioc->admin_req_pi, &mrioc->sysif_regs->admin_request_queue_pi);
29612978
writel(mrioc->admin_reply_ci, &mrioc->sysif_regs->admin_reply_queue_ci);
29622979
return retval;
@@ -5413,6 +5430,7 @@ int mpi3mr_soft_reset_handler(struct mpi3mr_ioc *mrioc,
54135430
mpi3mr_reset_rc_name(reset_reason));
54145431

54155432
mrioc->device_refresh_on = 0;
5433+
scsi_block_requests(mrioc->shost);
54165434
mrioc->reset_in_progress = 1;
54175435
mrioc->stop_bsgs = 1;
54185436
mrioc->prev_reset_result = -1;
@@ -5521,6 +5539,7 @@ int mpi3mr_soft_reset_handler(struct mpi3mr_ioc *mrioc,
55215539
if (!retval) {
55225540
mrioc->diagsave_timeout = 0;
55235541
mrioc->reset_in_progress = 0;
5542+
scsi_unblock_requests(mrioc->shost);
55245543
mrioc->pel_abort_requested = 0;
55255544
if (mrioc->pel_enabled) {
55265545
mrioc->pel_cmds.retry_count = 0;
@@ -5545,6 +5564,7 @@ int mpi3mr_soft_reset_handler(struct mpi3mr_ioc *mrioc,
55455564
mrioc->device_refresh_on = 0;
55465565
mrioc->unrecoverable = 1;
55475566
mrioc->reset_in_progress = 0;
5567+
scsi_unblock_requests(mrioc->shost);
55485568
mrioc->stop_bsgs = 0;
55495569
retval = -1;
55505570
mpi3mr_flush_cmds_for_unrecovered_controller(mrioc);

drivers/scsi/mpi3mr/mpi3mr_os.c

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,13 @@ static void mpi3mr_send_event_ack(struct mpi3mr_ioc *mrioc, u8 event,
4949

5050
#define MPI3_EVENT_WAIT_FOR_DEVICES_TO_REFRESH (0xFFFE)
5151

52+
/*
53+
* SAS Log info code for a NCQ collateral abort after an NCQ error:
54+
* IOC_LOGINFO_PREFIX_PL | PL_LOGINFO_CODE_SATA_NCQ_FAIL_ALL_CMDS_AFTR_ERR
55+
* See: drivers/message/fusion/lsi/mpi_log_sas.h
56+
*/
57+
#define IOC_LOGINFO_SATA_NCQ_FAIL_AFTER_ERR 0x31080000
58+
5259
/**
5360
* mpi3mr_host_tag_for_scmd - Get host tag for a scmd
5461
* @mrioc: Adapter instance reference
@@ -1301,6 +1308,12 @@ static void mpi3mr_update_tgtdev(struct mpi3mr_ioc *mrioc,
13011308
if (vdinf->vd_state == MPI3_DEVICE0_VD_STATE_OFFLINE)
13021309
tgtdev->is_hidden = 1;
13031310
tgtdev->non_stl = 1;
1311+
tgtdev->dev_spec.vd_inf.reset_to =
1312+
max_t(u8, vdinf->vd_reset_to,
1313+
MPI3MR_INTADMCMD_TIMEOUT);
1314+
tgtdev->dev_spec.vd_inf.abort_to =
1315+
max_t(u8, vdinf->vd_abort_to,
1316+
MPI3MR_INTADMCMD_TIMEOUT);
13041317
tgtdev->dev_spec.vd_inf.tg_id = vdinf_io_throttle_group;
13051318
tgtdev->dev_spec.vd_inf.tg_high =
13061319
le16_to_cpu(vdinf->io_throttle_group_high) * 2048;
@@ -2042,8 +2055,8 @@ static void mpi3mr_fwevt_bh(struct mpi3mr_ioc *mrioc,
20422055
if (!fwevt->process_evt)
20432056
goto evt_ack;
20442057

2045-
dprint_event_bh(mrioc, "processing event(0x%02x) in the bottom half handler\n",
2046-
fwevt->event_id);
2058+
dprint_event_bh(mrioc, "processing event(0x%02x) -(0x%08x) in the bottom half handler\n",
2059+
fwevt->event_id, fwevt->evt_ctx);
20472060

20482061
switch (fwevt->event_id) {
20492062
case MPI3_EVENT_DEVICE_ADDED:
@@ -2859,12 +2872,14 @@ static void mpi3mr_preparereset_evt_th(struct mpi3mr_ioc *mrioc,
28592872
"prepare for reset event top half with rc=start\n");
28602873
if (mrioc->prepare_for_reset)
28612874
return;
2875+
scsi_block_requests(mrioc->shost);
28622876
mrioc->prepare_for_reset = 1;
28632877
mrioc->prepare_for_reset_timeout_counter = 0;
28642878
} else if (evtdata->reason_code == MPI3_EVENT_PREPARE_RESET_RC_ABORT) {
28652879
dprint_event_th(mrioc,
28662880
"prepare for reset top half with rc=abort\n");
28672881
mrioc->prepare_for_reset = 0;
2882+
scsi_unblock_requests(mrioc->shost);
28682883
mrioc->prepare_for_reset_timeout_counter = 0;
28692884
}
28702885
if ((event_reply->msg_flags & MPI3_EVENT_NOTIFY_MSGFLAGS_ACK_MASK)
@@ -3069,8 +3084,8 @@ void mpi3mr_os_handle_events(struct mpi3mr_ioc *mrioc,
30693084
}
30703085
if (process_evt_bh || ack_req) {
30713086
dprint_event_th(mrioc,
3072-
"scheduling bottom half handler for event(0x%02x),ack_required=%d\n",
3073-
evt_type, ack_req);
3087+
"scheduling bottom half handler for event(0x%02x) - (0x%08x), ack_required=%d\n",
3088+
evt_type, le32_to_cpu(event_reply->event_context), ack_req);
30743089
sz = event_reply->event_data_length * 4;
30753090
fwevt = mpi3mr_alloc_fwevt(sz);
30763091
if (!fwevt) {
@@ -3430,7 +3445,18 @@ void mpi3mr_process_op_reply_desc(struct mpi3mr_ioc *mrioc,
34303445
scmd->result = DID_NO_CONNECT << 16;
34313446
break;
34323447
case MPI3_IOCSTATUS_SCSI_IOC_TERMINATED:
3433-
scmd->result = DID_SOFT_ERROR << 16;
3448+
if (ioc_loginfo == IOC_LOGINFO_SATA_NCQ_FAIL_AFTER_ERR) {
3449+
/*
3450+
* This is a ATA NCQ command aborted due to another NCQ
3451+
* command failure. We must retry this command
3452+
* immediately but without incrementing its retry
3453+
* counter.
3454+
*/
3455+
WARN_ON_ONCE(xfer_count != 0);
3456+
scmd->result = DID_IMM_RETRY << 16;
3457+
} else {
3458+
scmd->result = DID_SOFT_ERROR << 16;
3459+
}
34343460
break;
34353461
case MPI3_IOCSTATUS_SCSI_TASK_TERMINATED:
34363462
case MPI3_IOCSTATUS_SCSI_EXT_TERMINATED:
@@ -3897,11 +3923,13 @@ int mpi3mr_issue_tm(struct mpi3mr_ioc *mrioc, u8 tm_type,
38973923
if (scsi_tgt_priv_data)
38983924
atomic_inc(&scsi_tgt_priv_data->block_io);
38993925

3900-
if (tgtdev && (tgtdev->dev_type == MPI3_DEVICE_DEVFORM_PCIE)) {
3901-
if (cmd_priv && tgtdev->dev_spec.pcie_inf.abort_to)
3902-
timeout = tgtdev->dev_spec.pcie_inf.abort_to;
3903-
else if (!cmd_priv && tgtdev->dev_spec.pcie_inf.reset_to)
3904-
timeout = tgtdev->dev_spec.pcie_inf.reset_to;
3926+
if (tgtdev) {
3927+
if (tgtdev->dev_type == MPI3_DEVICE_DEVFORM_PCIE)
3928+
timeout = cmd_priv ? tgtdev->dev_spec.pcie_inf.abort_to
3929+
: tgtdev->dev_spec.pcie_inf.reset_to;
3930+
else if (tgtdev->dev_type == MPI3_DEVICE_DEVFORM_VD)
3931+
timeout = cmd_priv ? tgtdev->dev_spec.vd_inf.abort_to
3932+
: tgtdev->dev_spec.vd_inf.reset_to;
39053933
}
39063934

39073935
init_completion(&drv_cmd->done);
@@ -5365,6 +5393,8 @@ mpi3mr_probe(struct pci_dev *pdev, const struct pci_device_id *id)
53655393
spin_lock_init(&mrioc->tgtdev_lock);
53665394
spin_lock_init(&mrioc->watchdog_lock);
53675395
spin_lock_init(&mrioc->chain_buf_lock);
5396+
spin_lock_init(&mrioc->adm_req_q_bar_writeq_lock);
5397+
spin_lock_init(&mrioc->adm_reply_q_bar_writeq_lock);
53685398
spin_lock_init(&mrioc->sas_node_lock);
53695399
spin_lock_init(&mrioc->trigger_lock);
53705400

drivers/scsi/mpi3mr/mpi3mr_transport.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -413,9 +413,11 @@ static void mpi3mr_remove_device_by_sas_address(struct mpi3mr_ioc *mrioc,
413413
sas_address, hba_port);
414414
if (tgtdev) {
415415
if (!list_empty(&tgtdev->list)) {
416-
list_del_init(&tgtdev->list);
417416
was_on_tgtdev_list = 1;
418-
mpi3mr_tgtdev_put(tgtdev);
417+
if (tgtdev->state == MPI3MR_DEV_REMOVE_HS_STARTED) {
418+
list_del_init(&tgtdev->list);
419+
mpi3mr_tgtdev_put(tgtdev);
420+
}
419421
}
420422
}
421423
spin_unlock_irqrestore(&mrioc->tgtdev_lock, flags);
@@ -2079,6 +2081,8 @@ int mpi3mr_expander_add(struct mpi3mr_ioc *mrioc, u16 handle)
20792081
link_rate = (expander_pg1.negotiated_link_rate &
20802082
MPI3_SAS_NEG_LINK_RATE_LOGICAL_MASK) >>
20812083
MPI3_SAS_NEG_LINK_RATE_LOGICAL_SHIFT;
2084+
if (link_rate < MPI3_SAS_NEG_LINK_RATE_1_5)
2085+
link_rate = MPI3_SAS_NEG_LINK_RATE_1_5;
20822086
mpi3mr_update_links(mrioc, sas_address_parent,
20832087
handle, i, link_rate, hba_port);
20842088
}
@@ -2388,6 +2392,9 @@ int mpi3mr_report_tgtdev_to_sas_transport(struct mpi3mr_ioc *mrioc,
23882392

23892393
link_rate = mpi3mr_get_sas_negotiated_logical_linkrate(mrioc, tgtdev);
23902394

2395+
if (link_rate < MPI3_SAS_NEG_LINK_RATE_1_5)
2396+
link_rate = MPI3_SAS_NEG_LINK_RATE_1_5;
2397+
23912398
mpi3mr_update_links(mrioc, sas_address_parent, tgtdev->dev_handle,
23922399
parent_phy_number, link_rate, hba_port);
23932400

0 commit comments

Comments
 (0)