Skip to content

Commit fae2160

Browse files
sreekanthbrcmmartinkpetersen
authored andcommitted
scsi: mpt3sas: Transition IOC to Ready state during shutdown
The IOC firmware assumes that the host driver is still alive after shutdown and continues to post events to host memory (due to faulty expander phy links, etc). This leads to 0x2666 (a bus fault occurred during a host-IOC memory access). Perform an IOC soft reset as part of shutdown to disable event posting. Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Sreekanth Reddy <[email protected]> Signed-off-by: Martin K. Petersen <[email protected]>
1 parent 6d8e7e7 commit fae2160

File tree

3 files changed

+26
-17
lines changed

3 files changed

+26
-17
lines changed

drivers/scsi/mpt3sas/mpt3sas_base.c

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2983,13 +2983,13 @@ _base_check_enable_msix(struct MPT3SAS_ADAPTER *ioc)
29832983
}
29842984

29852985
/**
2986-
* _base_free_irq - free irq
2986+
* mpt3sas_base_free_irq - free irq
29872987
* @ioc: per adapter object
29882988
*
29892989
* Freeing respective reply_queue from the list.
29902990
*/
2991-
static void
2992-
_base_free_irq(struct MPT3SAS_ADAPTER *ioc)
2991+
void
2992+
mpt3sas_base_free_irq(struct MPT3SAS_ADAPTER *ioc)
29932993
{
29942994
struct adapter_reply_queue *reply_q, *next;
29952995

@@ -3191,12 +3191,12 @@ _base_check_and_enable_high_iops_queues(struct MPT3SAS_ADAPTER *ioc,
31913191
}
31923192

31933193
/**
3194-
* _base_disable_msix - disables msix
3194+
* mpt3sas_base_disable_msix - disables msix
31953195
* @ioc: per adapter object
31963196
*
31973197
*/
3198-
static void
3199-
_base_disable_msix(struct MPT3SAS_ADAPTER *ioc)
3198+
void
3199+
mpt3sas_base_disable_msix(struct MPT3SAS_ADAPTER *ioc)
32003200
{
32013201
if (!ioc->msix_enable)
32023202
return;
@@ -3304,8 +3304,8 @@ _base_enable_msix(struct MPT3SAS_ADAPTER *ioc)
33043304
for (i = 0; i < ioc->reply_queue_count; i++) {
33053305
r = _base_request_irq(ioc, i);
33063306
if (r) {
3307-
_base_free_irq(ioc);
3308-
_base_disable_msix(ioc);
3307+
mpt3sas_base_free_irq(ioc);
3308+
mpt3sas_base_disable_msix(ioc);
33093309
goto try_ioapic;
33103310
}
33113311
}
@@ -3342,8 +3342,8 @@ mpt3sas_base_unmap_resources(struct MPT3SAS_ADAPTER *ioc)
33423342

33433343
dexitprintk(ioc, ioc_info(ioc, "%s\n", __func__));
33443344

3345-
_base_free_irq(ioc);
3346-
_base_disable_msix(ioc);
3345+
mpt3sas_base_free_irq(ioc);
3346+
mpt3sas_base_disable_msix(ioc);
33473347

33483348
kfree(ioc->replyPostRegisterIndex);
33493349
ioc->replyPostRegisterIndex = NULL;
@@ -7613,14 +7613,14 @@ _base_diag_reset(struct MPT3SAS_ADAPTER *ioc)
76137613
}
76147614

76157615
/**
7616-
* _base_make_ioc_ready - put controller in READY state
7616+
* mpt3sas_base_make_ioc_ready - put controller in READY state
76177617
* @ioc: per adapter object
76187618
* @type: FORCE_BIG_HAMMER or SOFT_RESET
76197619
*
76207620
* Return: 0 for success, non-zero for failure.
76217621
*/
7622-
static int
7623-
_base_make_ioc_ready(struct MPT3SAS_ADAPTER *ioc, enum reset_type type)
7622+
int
7623+
mpt3sas_base_make_ioc_ready(struct MPT3SAS_ADAPTER *ioc, enum reset_type type)
76247624
{
76257625
u32 ioc_state;
76267626
int rc;
@@ -7897,7 +7897,7 @@ mpt3sas_base_free_resources(struct MPT3SAS_ADAPTER *ioc)
78977897
if (ioc->chip_phys && ioc->chip) {
78987898
mpt3sas_base_mask_interrupts(ioc);
78997899
ioc->shost_recovery = 1;
7900-
_base_make_ioc_ready(ioc, SOFT_RESET);
7900+
mpt3sas_base_make_ioc_ready(ioc, SOFT_RESET);
79017901
ioc->shost_recovery = 0;
79027902
}
79037903

@@ -8017,7 +8017,7 @@ mpt3sas_base_attach(struct MPT3SAS_ADAPTER *ioc)
80178017
ioc->build_sg_mpi = &_base_build_sg;
80188018
ioc->build_zero_len_sge_mpi = &_base_build_zero_len_sge;
80198019

8020-
r = _base_make_ioc_ready(ioc, SOFT_RESET);
8020+
r = mpt3sas_base_make_ioc_ready(ioc, SOFT_RESET);
80218021
if (r)
80228022
goto out_free_resources;
80238023

@@ -8471,7 +8471,7 @@ mpt3sas_base_hard_reset_handler(struct MPT3SAS_ADAPTER *ioc,
84718471
_base_pre_reset_handler(ioc);
84728472
mpt3sas_wait_for_commands_to_complete(ioc);
84738473
mpt3sas_base_mask_interrupts(ioc);
8474-
r = _base_make_ioc_ready(ioc, type);
8474+
r = mpt3sas_base_make_ioc_ready(ioc, type);
84758475
if (r)
84768476
goto out;
84778477
_base_clear_outstanding_commands(ioc);

drivers/scsi/mpt3sas/mpt3sas_base.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1730,6 +1730,10 @@ do { ioc_err(ioc, "In func: %s\n", __func__); \
17301730
status, mpi_request, sz); } while (0)
17311731

17321732
int mpt3sas_wait_for_ioc(struct MPT3SAS_ADAPTER *ioc, int wait_count);
1733+
int
1734+
mpt3sas_base_make_ioc_ready(struct MPT3SAS_ADAPTER *ioc, enum reset_type type);
1735+
void mpt3sas_base_free_irq(struct MPT3SAS_ADAPTER *ioc);
1736+
void mpt3sas_base_disable_msix(struct MPT3SAS_ADAPTER *ioc);
17331737

17341738
/* scsih shared API */
17351739
struct scsi_cmnd *mpt3sas_scsih_scsi_lookup_get(struct MPT3SAS_ADAPTER *ioc,

drivers/scsi/mpt3sas/mpt3sas_scsih.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11295,7 +11295,12 @@ scsih_shutdown(struct pci_dev *pdev)
1129511295

1129611296
_scsih_ir_shutdown(ioc);
1129711297
_scsih_nvme_shutdown(ioc);
11298-
mpt3sas_base_detach(ioc);
11298+
mpt3sas_base_mask_interrupts(ioc);
11299+
ioc->shost_recovery = 1;
11300+
mpt3sas_base_make_ioc_ready(ioc, SOFT_RESET);
11301+
ioc->shost_recovery = 0;
11302+
mpt3sas_base_free_irq(ioc);
11303+
mpt3sas_base_disable_msix(ioc);
1129911304
}
1130011305

1130111306

0 commit comments

Comments
 (0)