[SCSI] bfa: kdump fix on 815 and 825 adapters
Root cause: When kernel crashes, On brocade 815/825 adapters, bfa IOC state machine and FW doesn't get a notification and hence are not cleanly shutdown. So registers holding driver/IOC state information are not reset back to valid disabled/parking values. This causes subsequent driver initialization to fail during kdump kernel boot. Fix description: during the initialization of first PCI function, reset corresponding register when unclean shutown is detect by reading chip registers. This will make sure that ioc/fw gets clean re-initialization. Signed-off-by: Vijaya Mohan Guvva <vmohan@brocade.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:

کامیت شده توسط
James Bottomley

والد
f2a0cc3ffd
کامیت
c679b599af
@@ -43,6 +43,12 @@ static void bfa_ioc_ct_sync_join(struct bfa_ioc_s *ioc);
|
||||
static void bfa_ioc_ct_sync_leave(struct bfa_ioc_s *ioc);
|
||||
static void bfa_ioc_ct_sync_ack(struct bfa_ioc_s *ioc);
|
||||
static bfa_boolean_t bfa_ioc_ct_sync_complete(struct bfa_ioc_s *ioc);
|
||||
static void bfa_ioc_ct_set_cur_ioc_fwstate(
|
||||
struct bfa_ioc_s *ioc, enum bfi_ioc_state fwstate);
|
||||
static enum bfi_ioc_state bfa_ioc_ct_get_cur_ioc_fwstate(struct bfa_ioc_s *ioc);
|
||||
static void bfa_ioc_ct_set_alt_ioc_fwstate(
|
||||
struct bfa_ioc_s *ioc, enum bfi_ioc_state fwstate);
|
||||
static enum bfi_ioc_state bfa_ioc_ct_get_alt_ioc_fwstate(struct bfa_ioc_s *ioc);
|
||||
|
||||
static struct bfa_ioc_hwif_s hwif_ct;
|
||||
static struct bfa_ioc_hwif_s hwif_ct2;
|
||||
@@ -512,6 +518,10 @@ bfa_ioc_set_ctx_hwif(struct bfa_ioc_s *ioc, struct bfa_ioc_hwif_s *hwif)
|
||||
hwif->ioc_sync_leave = bfa_ioc_ct_sync_leave;
|
||||
hwif->ioc_sync_ack = bfa_ioc_ct_sync_ack;
|
||||
hwif->ioc_sync_complete = bfa_ioc_ct_sync_complete;
|
||||
hwif->ioc_set_fwstate = bfa_ioc_ct_set_cur_ioc_fwstate;
|
||||
hwif->ioc_get_fwstate = bfa_ioc_ct_get_cur_ioc_fwstate;
|
||||
hwif->ioc_set_alt_fwstate = bfa_ioc_ct_set_alt_ioc_fwstate;
|
||||
hwif->ioc_get_alt_fwstate = bfa_ioc_ct_get_alt_ioc_fwstate;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -959,3 +969,29 @@ bfa_ioc_ct2_pll_init(void __iomem *rb, enum bfi_asic_mode mode)
|
||||
|
||||
return BFA_STATUS_OK;
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_ioc_ct_set_cur_ioc_fwstate(struct bfa_ioc_s *ioc,
|
||||
enum bfi_ioc_state fwstate)
|
||||
{
|
||||
writel(fwstate, ioc->ioc_regs.ioc_fwstate);
|
||||
}
|
||||
|
||||
static enum bfi_ioc_state
|
||||
bfa_ioc_ct_get_cur_ioc_fwstate(struct bfa_ioc_s *ioc)
|
||||
{
|
||||
return (enum bfi_ioc_state)readl(ioc->ioc_regs.ioc_fwstate);
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_ioc_ct_set_alt_ioc_fwstate(struct bfa_ioc_s *ioc,
|
||||
enum bfi_ioc_state fwstate)
|
||||
{
|
||||
writel(fwstate, ioc->ioc_regs.alt_ioc_fwstate);
|
||||
}
|
||||
|
||||
static enum bfi_ioc_state
|
||||
bfa_ioc_ct_get_alt_ioc_fwstate(struct bfa_ioc_s *ioc)
|
||||
{
|
||||
return (enum bfi_ioc_state) readl(ioc->ioc_regs.alt_ioc_fwstate);
|
||||
}
|
||||
|
مرجع در شماره جدید
Block a user