mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-07 18:40:10 +00:00
[ Upstream commit 9ee5d6e9ac ]
Correct kdump hangs when controller is locked up.
There are occasions when a controller reboot (controller soft reset) is
issued when a controller firmware crash dump is in progress.
This leads to incomplete controller firmware crash dump:
- When the controller crash dump is in progress, and a kdump is initiated,
the driver issues inbound doorbell reset to bring back the controller in
SIS mode.
- If the controller is in locked up state, the inbound doorbell reset does
not work causing controller initialization failures. This results in the
driver hanging waiting for SIS mode.
To avoid an incomplete controller crash dump, add in a controller crash
dump handshake:
- Controller will indicate start and end of the controller crash dump by
setting some register bits.
- Driver will look these bits when a kdump is initiated. If a controller
crash dump is in progress, the driver will wait for the controller crash
dump to complete before issuing the controller soft reset then complete
driver initialization.
Link: https://lore.kernel.org/r/20210928235442.201875-3-don.brace@microchip.com
Reviewed-by: Scott Benesh <scott.benesh@microchip.com>
Reviewed-by: Scott Teel <scott.teel@microchip.com>
Reviewed-by: Mike McGowen <mike.mcgowen@microchip.com>
Acked-by: John Donnelly <john.p.donnelly@oracle.com>
Signed-off-by: Mahesh Rajashekhara <mahesh.rajashekhara@microchip.com>
Signed-off-by: Don Brace <don.brace@microchip.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
34 lines
1.4 KiB
C
34 lines
1.4 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* driver for Microchip PQI-based storage controllers
|
|
* Copyright (c) 2019-2021 Microchip Technology Inc. and its subsidiaries
|
|
* Copyright (c) 2016-2018 Microsemi Corporation
|
|
* Copyright (c) 2016 PMC-Sierra, Inc.
|
|
*
|
|
* Questions/Comments/Bugfixes to storagedev@microchip.com
|
|
*
|
|
*/
|
|
|
|
#if !defined(_SMARTPQI_SIS_H)
|
|
#define _SMARTPQI_SIS_H
|
|
|
|
int sis_wait_for_ctrl_ready(struct pqi_ctrl_info *ctrl_info);
|
|
int sis_wait_for_ctrl_ready_resume(struct pqi_ctrl_info *ctrl_info);
|
|
bool sis_is_firmware_running(struct pqi_ctrl_info *ctrl_info);
|
|
bool sis_is_kernel_up(struct pqi_ctrl_info *ctrl_info);
|
|
int sis_get_ctrl_properties(struct pqi_ctrl_info *ctrl_info);
|
|
int sis_get_pqi_capabilities(struct pqi_ctrl_info *ctrl_info);
|
|
int sis_init_base_struct_addr(struct pqi_ctrl_info *ctrl_info);
|
|
void sis_enable_msix(struct pqi_ctrl_info *ctrl_info);
|
|
void sis_enable_intx(struct pqi_ctrl_info *ctrl_info);
|
|
void sis_shutdown_ctrl(struct pqi_ctrl_info *ctrl_info);
|
|
int sis_pqi_reset_quiesce(struct pqi_ctrl_info *ctrl_info);
|
|
int sis_reenable_sis_mode(struct pqi_ctrl_info *ctrl_info);
|
|
void sis_write_driver_scratch(struct pqi_ctrl_info *ctrl_info, u32 value);
|
|
u32 sis_read_driver_scratch(struct pqi_ctrl_info *ctrl_info);
|
|
void sis_soft_reset(struct pqi_ctrl_info *ctrl_info);
|
|
u32 sis_get_product_id(struct pqi_ctrl_info *ctrl_info);
|
|
int sis_wait_for_fw_triage_completion(struct pqi_ctrl_info *ctrl_info);
|
|
|
|
#endif /* _SMARTPQI_SIS_H */
|