mirror of https://gitee.com/openkylin/linux.git
[SCSI] mpt fusion: Add Firmware debug support
Signed-off-by: Kashyap Desai <kadesai@lsi.com> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
This commit is contained in:
parent
e382968ba6
commit
2f4c782c2e
|
@ -107,6 +107,14 @@ module_param_call(mpt_debug_level, mpt_set_debug_level, param_get_int,
|
|||
MODULE_PARM_DESC(mpt_debug_level, " debug level - refer to mptdebug.h \
|
||||
- (default=0)");
|
||||
|
||||
int mpt_fwfault_debug;
|
||||
EXPORT_SYMBOL(mpt_fwfault_debug);
|
||||
module_param_call(mpt_fwfault_debug, param_set_int, param_get_int,
|
||||
&mpt_fwfault_debug, 0600);
|
||||
MODULE_PARM_DESC(mpt_fwfault_debug, "Enable detection of Firmware fault"
|
||||
" and halt Firmware on fault - (default=0)");
|
||||
|
||||
|
||||
|
||||
#ifdef MFCNT
|
||||
static int mfcounter = 0;
|
||||
|
@ -6337,6 +6345,33 @@ mpt_print_ioc_summary(MPT_ADAPTER *ioc, char *buffer, int *size, int len, int sh
|
|||
*size = y;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* mpt_halt_firmware - Halts the firmware if it is operational and panic
|
||||
* the kernel
|
||||
* @ioc: Pointer to MPT_ADAPTER structure
|
||||
*
|
||||
**/
|
||||
void
|
||||
mpt_halt_firmware(MPT_ADAPTER *ioc)
|
||||
{
|
||||
u32 ioc_raw_state;
|
||||
|
||||
ioc_raw_state = mpt_GetIocState(ioc, 0);
|
||||
|
||||
if ((ioc_raw_state & MPI_IOC_STATE_MASK) == MPI_IOC_STATE_FAULT) {
|
||||
printk(MYIOC_s_ERR_FMT "IOC is in FAULT state (%04xh)!!!\n",
|
||||
ioc->name, ioc_raw_state & MPI_DOORBELL_DATA_MASK);
|
||||
panic("%s: IOC Fault (%04xh)!!!\n", ioc->name,
|
||||
ioc_raw_state & MPI_DOORBELL_DATA_MASK);
|
||||
} else {
|
||||
CHIPREG_WRITE32(&ioc->chip->Doorbell, 0xC0FFEE00);
|
||||
panic("%s: Firmware is halted due to command timeout\n",
|
||||
ioc->name);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(mpt_halt_firmware);
|
||||
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
/*
|
||||
* Reset Handling
|
||||
|
@ -6369,6 +6404,8 @@ mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag)
|
|||
printk(MYIOC_s_INFO_FMT "HardResetHandler Entered!\n", ioc->name);
|
||||
printk("MF count 0x%x !\n", ioc->mfcnt);
|
||||
#endif
|
||||
if (mpt_fwfault_debug)
|
||||
mpt_halt_firmware(ioc);
|
||||
|
||||
/* Reset the adapter. Prevent more than 1 call to
|
||||
* mpt_do_ioc_recovery at any instant in time.
|
||||
|
|
|
@ -922,11 +922,14 @@ extern void mpt_free_fw_memory(MPT_ADAPTER *ioc);
|
|||
extern int mpt_findImVolumes(MPT_ADAPTER *ioc);
|
||||
extern int mptbase_sas_persist_operation(MPT_ADAPTER *ioc, u8 persist_opcode);
|
||||
extern int mpt_raid_phys_disk_pg0(MPT_ADAPTER *ioc, u8 phys_disk_num, pRaidPhysDiskPage0_t phys_disk);
|
||||
extern void mpt_halt_firmware(MPT_ADAPTER *ioc);
|
||||
|
||||
|
||||
/*
|
||||
* Public data decl's...
|
||||
*/
|
||||
extern struct list_head ioc_list;
|
||||
extern int mpt_fwfault_debug;
|
||||
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
#endif /* } __KERNEL__ */
|
||||
|
|
|
@ -1846,6 +1846,9 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)
|
|||
if (hd->timeouts < -1)
|
||||
hd->timeouts++;
|
||||
|
||||
if (mpt_fwfault_debug)
|
||||
mpt_halt_firmware(ioc);
|
||||
|
||||
/* Most important! Set TaskMsgContext to SCpnt's MsgContext!
|
||||
* (the IO to be ABORT'd)
|
||||
*
|
||||
|
|
Loading…
Reference in New Issue