Commit 11189208 authored by Krishna Gudipati's avatar Krishna Gudipati Committed by James Bottomley

[SCSI] bfa: Brocade-1860 Fabric Adapter Hardware Enablement

- Added support for Brocade-1860 Fabric Adapter.
- Made changes to support single firmware image per asic type.
- Combined bfi_cbreg.h and bfi_ctreg.h defines into bfi_reg.h with
  only minimal defines used by host.
- Added changes to setup CPE/RME Queue register offsets based on
  firmware response.
- Removed queue register offset initializations and added register offsets
  to BFI config response message.
- Added Brocade-1860 asic specific interrupt status definitions and
  mailbox interfaces.
Signed-off-by: default avatarKrishna Gudipati <kgudipat@brocade.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent 43ffdf4d
...@@ -136,7 +136,6 @@ struct bfa_cb_qe_s { ...@@ -136,7 +136,6 @@ struct bfa_cb_qe_s {
struct list_head qe; struct list_head qe;
bfa_cb_cbfn_t cbfn; bfa_cb_cbfn_t cbfn;
bfa_boolean_t once; bfa_boolean_t once;
u32 rsvd;
void *cbarg; void *cbarg;
}; };
...@@ -205,11 +204,9 @@ struct bfa_iocfc_regs_s { ...@@ -205,11 +204,9 @@ struct bfa_iocfc_regs_s {
void __iomem *intr_mask; void __iomem *intr_mask;
void __iomem *cpe_q_pi[BFI_IOC_MAX_CQS]; void __iomem *cpe_q_pi[BFI_IOC_MAX_CQS];
void __iomem *cpe_q_ci[BFI_IOC_MAX_CQS]; void __iomem *cpe_q_ci[BFI_IOC_MAX_CQS];
void __iomem *cpe_q_depth[BFI_IOC_MAX_CQS];
void __iomem *cpe_q_ctrl[BFI_IOC_MAX_CQS]; void __iomem *cpe_q_ctrl[BFI_IOC_MAX_CQS];
void __iomem *rme_q_ci[BFI_IOC_MAX_CQS]; void __iomem *rme_q_ci[BFI_IOC_MAX_CQS];
void __iomem *rme_q_pi[BFI_IOC_MAX_CQS]; void __iomem *rme_q_pi[BFI_IOC_MAX_CQS];
void __iomem *rme_q_depth[BFI_IOC_MAX_CQS];
void __iomem *rme_q_ctrl[BFI_IOC_MAX_CQS]; void __iomem *rme_q_ctrl[BFI_IOC_MAX_CQS];
}; };
...@@ -238,6 +235,8 @@ struct bfa_hwif_s { ...@@ -238,6 +235,8 @@ struct bfa_hwif_s {
u32 *nvecs, u32 *maxvec); u32 *nvecs, u32 *maxvec);
void (*hw_msix_get_rme_range) (struct bfa_s *bfa, u32 *start, void (*hw_msix_get_rme_range) (struct bfa_s *bfa, u32 *start,
u32 *end); u32 *end);
int cpe_vec_q0;
int rme_vec_q0;
}; };
typedef void (*bfa_cb_iocfc_t) (void *cbarg, enum bfa_status status); typedef void (*bfa_cb_iocfc_t) (void *cbarg, enum bfa_status status);
...@@ -257,7 +256,6 @@ struct bfa_iocfc_s { ...@@ -257,7 +256,6 @@ struct bfa_iocfc_s {
struct bfi_iocfc_cfg_s *cfginfo; struct bfi_iocfc_cfg_s *cfginfo;
struct bfa_dma_s cfgrsp_dma; struct bfa_dma_s cfgrsp_dma;
struct bfi_iocfc_cfgrsp_s *cfgrsp; struct bfi_iocfc_cfgrsp_s *cfgrsp;
struct bfi_iocfc_cfg_reply_s *cfg_reply;
struct bfa_dma_s req_cq_ba[BFI_IOC_MAX_CQS]; struct bfa_dma_s req_cq_ba[BFI_IOC_MAX_CQS];
struct bfa_dma_s req_cq_shadow_ci[BFI_IOC_MAX_CQS]; struct bfa_dma_s req_cq_shadow_ci[BFI_IOC_MAX_CQS];
struct bfa_dma_s rsp_cq_ba[BFI_IOC_MAX_CQS]; struct bfa_dma_s rsp_cq_ba[BFI_IOC_MAX_CQS];
...@@ -277,8 +275,11 @@ struct bfa_iocfc_s { ...@@ -277,8 +275,11 @@ struct bfa_iocfc_s {
((__bfa)->iocfc.hwif.hw_msix_install(__bfa)) ((__bfa)->iocfc.hwif.hw_msix_install(__bfa))
#define bfa_msix_uninstall(__bfa) \ #define bfa_msix_uninstall(__bfa) \
((__bfa)->iocfc.hwif.hw_msix_uninstall(__bfa)) ((__bfa)->iocfc.hwif.hw_msix_uninstall(__bfa))
#define bfa_isr_mode_set(__bfa, __msix) \ #define bfa_isr_mode_set(__bfa, __msix) do { \
((__bfa)->iocfc.hwif.hw_isr_mode_set(__bfa, __msix)) if ((__bfa)->iocfc.hwif.hw_isr_mode_set) \
(__bfa)->iocfc.hwif.hw_isr_mode_set(__bfa, __msix); \
} while (0)
#define bfa_msix_getvecs(__bfa, __vecmap, __nvecs, __maxvec) \ #define bfa_msix_getvecs(__bfa, __vecmap, __nvecs, __maxvec) \
((__bfa)->iocfc.hwif.hw_msix_getvecs(__bfa, __vecmap, \ ((__bfa)->iocfc.hwif.hw_msix_getvecs(__bfa, __vecmap, \
__nvecs, __maxvec)) __nvecs, __maxvec))
...@@ -321,6 +322,7 @@ void bfa_hwcb_msix_getvecs(struct bfa_s *bfa, u32 *vecmap, u32 *nvecs, ...@@ -321,6 +322,7 @@ void bfa_hwcb_msix_getvecs(struct bfa_s *bfa, u32 *vecmap, u32 *nvecs,
void bfa_hwcb_msix_get_rme_range(struct bfa_s *bfa, u32 *start, void bfa_hwcb_msix_get_rme_range(struct bfa_s *bfa, u32 *start,
u32 *end); u32 *end);
void bfa_hwct_reginit(struct bfa_s *bfa); void bfa_hwct_reginit(struct bfa_s *bfa);
void bfa_hwct2_reginit(struct bfa_s *bfa);
void bfa_hwct_reqq_ack(struct bfa_s *bfa, int rspq); void bfa_hwct_reqq_ack(struct bfa_s *bfa, int rspq);
void bfa_hwct_rspq_ack(struct bfa_s *bfa, int rspq); void bfa_hwct_rspq_ack(struct bfa_s *bfa, int rspq);
void bfa_hwct_msix_init(struct bfa_s *bfa, int nvecs); void bfa_hwct_msix_init(struct bfa_s *bfa, int nvecs);
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
#include "bfad_drv.h" #include "bfad_drv.h"
#include "bfa_modules.h" #include "bfa_modules.h"
#include "bfi_ctreg.h" #include "bfi_reg.h"
BFA_TRC_FILE(HAL, CORE); BFA_TRC_FILE(HAL, CORE);
...@@ -173,6 +173,58 @@ bfa_reqq_resume(struct bfa_s *bfa, int qid) ...@@ -173,6 +173,58 @@ bfa_reqq_resume(struct bfa_s *bfa, int qid)
} }
} }
static inline void
bfa_isr_rspq(struct bfa_s *bfa, int qid)
{
struct bfi_msg_s *m;
u32 pi, ci;
struct list_head *waitq;
bfa->iocfc.hwif.hw_rspq_ack(bfa, qid);
ci = bfa_rspq_ci(bfa, qid);
pi = bfa_rspq_pi(bfa, qid);
while (ci != pi) {
m = bfa_rspq_elem(bfa, qid, ci);
WARN_ON(m->mhdr.msg_class >= BFI_MC_MAX);
bfa_isrs[m->mhdr.msg_class] (bfa, m);
CQ_INCR(ci, bfa->iocfc.cfg.drvcfg.num_rspq_elems);
}
/*
* update CI
*/
bfa_rspq_ci(bfa, qid) = pi;
writel(pi, bfa->iocfc.bfa_regs.rme_q_ci[qid]);
mmiowb();
/*
* Resume any pending requests in the corresponding reqq.
*/
waitq = bfa_reqq(bfa, qid);
if (!list_empty(waitq))
bfa_reqq_resume(bfa, qid);
}
static inline void
bfa_isr_reqq(struct bfa_s *bfa, int qid)
{
struct list_head *waitq;
qid &= (BFI_IOC_MAX_CQS - 1);
bfa->iocfc.hwif.hw_reqq_ack(bfa, qid);
/*
* Resume any pending requests in the corresponding reqq.
*/
waitq = bfa_reqq(bfa, qid);
if (!list_empty(waitq))
bfa_reqq_resume(bfa, qid);
}
void void
bfa_msix_all(struct bfa_s *bfa, int vec) bfa_msix_all(struct bfa_s *bfa, int vec)
{ {
...@@ -197,7 +249,7 @@ bfa_intx(struct bfa_s *bfa) ...@@ -197,7 +249,7 @@ bfa_intx(struct bfa_s *bfa)
for (queue = 0; queue < BFI_IOC_MAX_CQS_ASIC; queue++) { for (queue = 0; queue < BFI_IOC_MAX_CQS_ASIC; queue++) {
if (intr & (__HFN_INT_RME_Q0 << queue)) if (intr & (__HFN_INT_RME_Q0 << queue))
bfa_msix_rspq(bfa, queue & (BFI_IOC_MAX_CQS - 1)); bfa_isr_rspq(bfa, queue & (BFI_IOC_MAX_CQS - 1));
} }
intr &= ~qintr; intr &= ~qintr;
if (!intr) if (!intr)
...@@ -211,7 +263,7 @@ bfa_intx(struct bfa_s *bfa) ...@@ -211,7 +263,7 @@ bfa_intx(struct bfa_s *bfa)
for (queue = 0; queue < BFI_IOC_MAX_CQS_ASIC; queue++) { for (queue = 0; queue < BFI_IOC_MAX_CQS_ASIC; queue++) {
if (intr & (__HFN_INT_CPE_Q0 << queue)) if (intr & (__HFN_INT_CPE_Q0 << queue))
bfa_msix_reqq(bfa, queue & (BFI_IOC_MAX_CQS - 1)); bfa_isr_reqq(bfa, queue & (BFI_IOC_MAX_CQS - 1));
} }
intr &= ~qintr; intr &= ~qintr;
if (!intr) if (!intr)
...@@ -225,32 +277,25 @@ bfa_intx(struct bfa_s *bfa) ...@@ -225,32 +277,25 @@ bfa_intx(struct bfa_s *bfa)
void void
bfa_isr_enable(struct bfa_s *bfa) bfa_isr_enable(struct bfa_s *bfa)
{ {
u32 intr_unmask; u32 umsk;
int pci_func = bfa_ioc_pcifn(&bfa->ioc); int pci_func = bfa_ioc_pcifn(&bfa->ioc);
bfa_trc(bfa, pci_func); bfa_trc(bfa, pci_func);
bfa_msix_install(bfa); bfa_msix_install(bfa);
intr_unmask = (__HFN_INT_ERR_EMC | __HFN_INT_ERR_LPU0 |
__HFN_INT_ERR_LPU1 | __HFN_INT_ERR_PSS | if (bfa_asic_id_ct2(bfa->ioc.pcidev.device_id)) {
__HFN_INT_LL_HALT); umsk = __HFN_INT_ERR_MASK_CT2;
umsk |= pci_func == 0 ?
if (pci_func == 0) __HFN_INT_FN0_MASK_CT2 : __HFN_INT_FN1_MASK_CT2;
intr_unmask |= (__HFN_INT_CPE_Q0 | __HFN_INT_CPE_Q1 | } else {
__HFN_INT_CPE_Q2 | __HFN_INT_CPE_Q3 | umsk = __HFN_INT_ERR_MASK;
__HFN_INT_RME_Q0 | __HFN_INT_RME_Q1 | umsk |= pci_func == 0 ? __HFN_INT_FN0_MASK : __HFN_INT_FN1_MASK;
__HFN_INT_RME_Q2 | __HFN_INT_RME_Q3 | }
__HFN_INT_MBOX_LPU0);
else writel(umsk, bfa->iocfc.bfa_regs.intr_status);
intr_unmask |= (__HFN_INT_CPE_Q4 | __HFN_INT_CPE_Q5 | writel(~umsk, bfa->iocfc.bfa_regs.intr_mask);
__HFN_INT_CPE_Q6 | __HFN_INT_CPE_Q7 | bfa->iocfc.intr_mask = ~umsk;
__HFN_INT_RME_Q4 | __HFN_INT_RME_Q5 |
__HFN_INT_RME_Q6 | __HFN_INT_RME_Q7 |
__HFN_INT_MBOX_LPU1);
writel(intr_unmask, bfa->iocfc.bfa_regs.intr_status);
writel(~intr_unmask, bfa->iocfc.bfa_regs.intr_mask);
bfa->iocfc.intr_mask = ~intr_unmask;
bfa_isr_mode_set(bfa, bfa->msix.nvecs != 0); bfa_isr_mode_set(bfa, bfa->msix.nvecs != 0);
} }
...@@ -263,20 +308,9 @@ bfa_isr_disable(struct bfa_s *bfa) ...@@ -263,20 +308,9 @@ bfa_isr_disable(struct bfa_s *bfa)
} }
void void
bfa_msix_reqq(struct bfa_s *bfa, int qid) bfa_msix_reqq(struct bfa_s *bfa, int vec)
{ {
struct list_head *waitq; bfa_isr_reqq(bfa, vec - bfa->iocfc.hwif.cpe_vec_q0);
qid &= (BFI_IOC_MAX_CQS - 1);
bfa->iocfc.hwif.hw_reqq_ack(bfa, qid);
/*
* Resume any pending requests in the corresponding reqq.
*/
waitq = bfa_reqq(bfa, qid);
if (!list_empty(waitq))
bfa_reqq_resume(bfa, qid);
} }
void void
...@@ -290,57 +324,40 @@ bfa_isr_unhandled(struct bfa_s *bfa, struct bfi_msg_s *m) ...@@ -290,57 +324,40 @@ bfa_isr_unhandled(struct bfa_s *bfa, struct bfi_msg_s *m)
} }
void void
bfa_msix_rspq(struct bfa_s *bfa, int qid) bfa_msix_rspq(struct bfa_s *bfa, int vec)
{ {
struct bfi_msg_s *m; if (!bfa->rme_process)
u32 pi, ci; return;
struct list_head *waitq;
qid &= (BFI_IOC_MAX_CQS - 1);
bfa->iocfc.hwif.hw_rspq_ack(bfa, qid);
ci = bfa_rspq_ci(bfa, qid);
pi = bfa_rspq_pi(bfa, qid);
if (bfa->rme_process) {
while (ci != pi) {
m = bfa_rspq_elem(bfa, qid, ci);
bfa_isrs[m->mhdr.msg_class] (bfa, m);
CQ_INCR(ci, bfa->iocfc.cfg.drvcfg.num_rspq_elems);
}
}
/*
* update CI
*/
bfa_rspq_ci(bfa, qid) = pi;
writel(pi, bfa->iocfc.bfa_regs.rme_q_ci[qid]);
mmiowb();
/* bfa_isr_rspq(bfa, vec - bfa->iocfc.hwif.rme_vec_q0);
* Resume any pending requests in the corresponding reqq.
*/
waitq = bfa_reqq(bfa, qid);
if (!list_empty(waitq))
bfa_reqq_resume(bfa, qid);
} }
void void
bfa_msix_lpu_err(struct bfa_s *bfa, int vec) bfa_msix_lpu_err(struct bfa_s *bfa, int vec)
{ {
u32 intr, curr_value; u32 intr, curr_value;
bfa_boolean_t lpu_isr, halt_isr, pss_isr;
intr = readl(bfa->iocfc.bfa_regs.intr_status); intr = readl(bfa->iocfc.bfa_regs.intr_status);
if (intr & (__HFN_INT_MBOX_LPU0 | __HFN_INT_MBOX_LPU1)) if (bfa_asic_id_ct2(bfa->ioc.pcidev.device_id)) {
bfa_ioc_mbox_isr(&bfa->ioc); halt_isr = intr & __HFN_INT_CPQ_HALT_CT2;
pss_isr = intr & __HFN_INT_ERR_PSS_CT2;
lpu_isr = intr & (__HFN_INT_MBOX_LPU0_CT2 |
__HFN_INT_MBOX_LPU1_CT2);
intr &= __HFN_INT_ERR_MASK_CT2;
} else {
halt_isr = intr & __HFN_INT_LL_HALT;
pss_isr = intr & __HFN_INT_ERR_PSS;
lpu_isr = intr & (__HFN_INT_MBOX_LPU0 | __HFN_INT_MBOX_LPU1);
intr &= __HFN_INT_ERR_MASK;
}
intr &= (__HFN_INT_ERR_EMC | __HFN_INT_ERR_LPU0 | if (lpu_isr)
__HFN_INT_ERR_LPU1 | __HFN_INT_ERR_PSS | __HFN_INT_LL_HALT); bfa_ioc_mbox_isr(&bfa->ioc);
if (intr) { if (intr) {
if (intr & __HFN_INT_LL_HALT) { if (halt_isr) {
/* /*
* If LL_HALT bit is set then FW Init Halt LL Port * If LL_HALT bit is set then FW Init Halt LL Port
* Register needs to be cleared as well so Interrupt * Register needs to be cleared as well so Interrupt
...@@ -351,7 +368,7 @@ bfa_msix_lpu_err(struct bfa_s *bfa, int vec) ...@@ -351,7 +368,7 @@ bfa_msix_lpu_err(struct bfa_s *bfa, int vec)
writel(curr_value, bfa->ioc.ioc_regs.ll_halt); writel(curr_value, bfa->ioc.ioc_regs.ll_halt);
} }
if (intr & __HFN_INT_ERR_PSS) { if (pss_isr) {
/* /*
* ERR_PSS bit needs to be cleared as well in case * ERR_PSS bit needs to be cleared as well in case
* interrups are shared so driver's interrupt handler is * interrups are shared so driver's interrupt handler is
...@@ -359,7 +376,6 @@ bfa_msix_lpu_err(struct bfa_s *bfa, int vec) ...@@ -359,7 +376,6 @@ bfa_msix_lpu_err(struct bfa_s *bfa, int vec)
*/ */
curr_value = readl( curr_value = readl(
bfa->ioc.ioc_regs.pss_err_status_reg); bfa->ioc.ioc_regs.pss_err_status_reg);
curr_value &= __PSS_ERR_STATUS_SET;
writel(curr_value, writel(curr_value,
bfa->ioc.ioc_regs.pss_err_status_reg); bfa->ioc.ioc_regs.pss_err_status_reg);
} }
...@@ -491,7 +507,7 @@ bfa_iocfc_init_mem(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg, ...@@ -491,7 +507,7 @@ bfa_iocfc_init_mem(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg,
/* /*
* Initialize chip specific handlers. * Initialize chip specific handlers.
*/ */
if (bfa_asic_id_ct(bfa_ioc_devid(&bfa->ioc))) { if (bfa_asic_id_ctc(bfa_ioc_devid(&bfa->ioc))) {
iocfc->hwif.hw_reginit = bfa_hwct_reginit; iocfc->hwif.hw_reginit = bfa_hwct_reginit;
iocfc->hwif.hw_reqq_ack = bfa_hwct_reqq_ack; iocfc->hwif.hw_reqq_ack = bfa_hwct_reqq_ack;
iocfc->hwif.hw_rspq_ack = bfa_hwct_rspq_ack; iocfc->hwif.hw_rspq_ack = bfa_hwct_rspq_ack;
...@@ -501,6 +517,8 @@ bfa_iocfc_init_mem(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg, ...@@ -501,6 +517,8 @@ bfa_iocfc_init_mem(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg,
iocfc->hwif.hw_isr_mode_set = bfa_hwct_isr_mode_set; iocfc->hwif.hw_isr_mode_set = bfa_hwct_isr_mode_set;
iocfc->hwif.hw_msix_getvecs = bfa_hwct_msix_getvecs; iocfc->hwif.hw_msix_getvecs = bfa_hwct_msix_getvecs;
iocfc->hwif.hw_msix_get_rme_range = bfa_hwct_msix_get_rme_range; iocfc->hwif.hw_msix_get_rme_range = bfa_hwct_msix_get_rme_range;
iocfc->hwif.rme_vec_q0 = BFI_MSIX_RME_QMIN_CT;
iocfc->hwif.cpe_vec_q0 = BFI_MSIX_CPE_QMIN_CT;
} else { } else {
iocfc->hwif.hw_reginit = bfa_hwcb_reginit; iocfc->hwif.hw_reginit = bfa_hwcb_reginit;
iocfc->hwif.hw_reqq_ack = bfa_hwcb_reqq_ack; iocfc->hwif.hw_reqq_ack = bfa_hwcb_reqq_ack;
...@@ -511,6 +529,15 @@ bfa_iocfc_init_mem(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg, ...@@ -511,6 +529,15 @@ bfa_iocfc_init_mem(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg,
iocfc->hwif.hw_isr_mode_set = bfa_hwcb_isr_mode_set; iocfc->hwif.hw_isr_mode_set = bfa_hwcb_isr_mode_set;
iocfc->hwif.hw_msix_getvecs = bfa_hwcb_msix_getvecs; iocfc->hwif.hw_msix_getvecs = bfa_hwcb_msix_getvecs;
iocfc->hwif.hw_msix_get_rme_range = bfa_hwcb_msix_get_rme_range; iocfc->hwif.hw_msix_get_rme_range = bfa_hwcb_msix_get_rme_range;
iocfc->hwif.rme_vec_q0 = BFI_MSIX_RME_QMIN_CB +
bfa_ioc_pcifn(&bfa->ioc) * BFI_IOC_MAX_CQS;
iocfc->hwif.cpe_vec_q0 = BFI_MSIX_CPE_QMIN_CB +
bfa_ioc_pcifn(&bfa->ioc) * BFI_IOC_MAX_CQS;
}
if (bfa_asic_id_ct2(bfa_ioc_devid(&bfa->ioc))) {
iocfc->hwif.hw_reginit = bfa_hwct2_reginit;
iocfc->hwif.hw_isr_mode_set = NULL;
} }
iocfc->hwif.hw_reginit(bfa); iocfc->hwif.hw_reginit(bfa);
...@@ -614,6 +641,8 @@ bfa_iocfc_start_submod(struct bfa_s *bfa) ...@@ -614,6 +641,8 @@ bfa_iocfc_start_submod(struct bfa_s *bfa)
int i; int i;
bfa->rme_process = BFA_TRUE; bfa->rme_process = BFA_TRUE;
for (i = 0; i < BFI_IOC_MAX_CQS; i++)
bfa->iocfc.hwif.hw_rspq_ack(bfa, i);
for (i = 0; hal_mods[i]; i++) for (i = 0; hal_mods[i]; i++)
hal_mods[i]->start(bfa); hal_mods[i]->start(bfa);
...@@ -669,6 +698,26 @@ bfa_iocfc_disable_cb(void *bfa_arg, bfa_boolean_t compl) ...@@ -669,6 +698,26 @@ bfa_iocfc_disable_cb(void *bfa_arg, bfa_boolean_t compl)
complete(&bfad->disable_comp); complete(&bfad->disable_comp);
} }
/**
* configure queue registers from firmware response
*/
static void
bfa_iocfc_qreg(struct bfa_s *bfa, struct bfi_iocfc_qreg_s *qreg)
{
int i;
struct bfa_iocfc_regs_s *r = &bfa->iocfc.bfa_regs;
void __iomem *kva = bfa_ioc_bar0(&bfa->ioc);
for (i = 0; i < BFI_IOC_MAX_CQS; i++) {
r->cpe_q_ci[i] = kva + be32_to_cpu(qreg->cpe_q_ci_off[i]);
r->cpe_q_pi[i] = kva + be32_to_cpu(qreg->cpe_q_pi_off[i]);
r->cpe_q_ctrl[i] = kva + be32_to_cpu(qreg->cpe_qctl_off[i]);
r->rme_q_ci[i] = kva + be32_to_cpu(qreg->rme_q_ci_off[i]);
r->rme_q_pi[i] = kva + be32_to_cpu(qreg->rme_q_pi_off[i]);
r->rme_q_ctrl[i] = kva + be32_to_cpu(qreg->rme_qctl_off[i]);
}
}
/* /*
* Update BFA configuration from firmware configuration. * Update BFA configuration from firmware configuration.
*/ */
...@@ -688,6 +737,11 @@ bfa_iocfc_cfgrsp(struct bfa_s *bfa) ...@@ -688,6 +737,11 @@ bfa_iocfc_cfgrsp(struct bfa_s *bfa)
iocfc->cfgdone = BFA_TRUE; iocfc->cfgdone = BFA_TRUE;
/*
* configure queue register offsets as learnt from firmware
*/
bfa_iocfc_qreg(bfa, &cfgrsp->qreg);
/* /*
* Configuration is complete - initialize/start submodules * Configuration is complete - initialize/start submodules
*/ */
...@@ -879,7 +933,6 @@ bfa_iocfc_isr(void *bfaarg, struct bfi_mbmsg_s *m) ...@@ -879,7 +933,6 @@ bfa_iocfc_isr(void *bfaarg, struct bfi_mbmsg_s *m)
switch (msg->mh.msg_id) { switch (msg->mh.msg_id) {
case BFI_IOCFC_I2H_CFG_REPLY: case BFI_IOCFC_I2H_CFG_REPLY:
iocfc->cfg_reply = &msg->cfg_reply;
bfa_iocfc_cfgrsp(bfa); bfa_iocfc_cfgrsp(bfa);
break; break;
case BFI_IOCFC_I2H_UPDATEQ_RSP: case BFI_IOCFC_I2H_UPDATEQ_RSP:
......
...@@ -386,11 +386,18 @@ enum { ...@@ -386,11 +386,18 @@ enum {
BFA_PCI_DEVICE_ID_FC_8G1P = 0x17, BFA_PCI_DEVICE_ID_FC_8G1P = 0x17,
BFA_PCI_DEVICE_ID_CT = 0x14, BFA_PCI_DEVICE_ID_CT = 0x14,
BFA_PCI_DEVICE_ID_CT_FC = 0x21, BFA_PCI_DEVICE_ID_CT_FC = 0x21,
BFA_PCI_DEVICE_ID_CT2 = 0x22,
}; };
#define bfa_asic_id_ct(devid) \ #define bfa_asic_id_cb(__d) \
((devid) == BFA_PCI_DEVICE_ID_CT || \ ((__d) == BFA_PCI_DEVICE_ID_FC_8G2P || \
(devid) == BFA_PCI_DEVICE_ID_CT_FC) (__d) == BFA_PCI_DEVICE_ID_FC_8G1P)
#define bfa_asic_id_ct(__d) \
((__d) == BFA_PCI_DEVICE_ID_CT || \
(__d) == BFA_PCI_DEVICE_ID_CT_FC)
#define bfa_asic_id_ct2(__d) ((__d) == BFA_PCI_DEVICE_ID_CT2)
#define bfa_asic_id_ctc(__d) \
(bfa_asic_id_ct(__d) || bfa_asic_id_ct2(__d))
/* /*
* PCI sub-system device and vendor ID information * PCI sub-system device and vendor ID information
......
...@@ -17,14 +17,14 @@ ...@@ -17,14 +17,14 @@
#include "bfad_drv.h" #include "bfad_drv.h"
#include "bfa_modules.h" #include "bfa_modules.h"
#include "bfi_cbreg.h" #include "bfi_reg.h"
void void
bfa_hwcb_reginit(struct bfa_s *bfa) bfa_hwcb_reginit(struct bfa_s *bfa)
{ {
struct bfa_iocfc_regs_s *bfa_regs = &bfa->iocfc.bfa_regs; struct bfa_iocfc_regs_s *bfa_regs = &bfa->iocfc.bfa_regs;
void __iomem *kva = bfa_ioc_bar0(&bfa->ioc); void __iomem *kva = bfa_ioc_bar0(&bfa->ioc);
int i, q, fn = bfa_ioc_pcifn(&bfa->ioc); int fn = bfa_ioc_pcifn(&bfa->ioc);
if (fn == 0) { if (fn == 0) {
bfa_regs->intr_status = (kva + HOSTFN0_INT_STATUS); bfa_regs->intr_status = (kva + HOSTFN0_INT_STATUS);
...@@ -33,24 +33,6 @@ bfa_hwcb_reginit(struct bfa_s *bfa) ...@@ -33,24 +33,6 @@ bfa_hwcb_reginit(struct bfa_s *bfa)
bfa_regs->intr_status = (kva + HOSTFN1_INT_STATUS); bfa_regs->intr_status = (kva + HOSTFN1_INT_STATUS);
bfa_regs->intr_mask = (kva + HOSTFN1_INT_MSK); bfa_regs->intr_mask = (kva + HOSTFN1_INT_MSK);
} }
for (i = 0; i < BFI_IOC_MAX_CQS; i++) {
/*
* CPE registers
*/
q = CPE_Q_NUM(fn, i);
bfa_regs->cpe_q_pi[i] = (kva + CPE_Q_PI(q));
bfa_regs->cpe_q_ci[i] = (kva + CPE_Q_CI(q));
bfa_regs->cpe_q_depth[i] = (kva + CPE_Q_DEPTH(q));
/*
* RME registers
*/
q = CPE_Q_NUM(fn, i);
bfa_regs->rme_q_pi[i] = (kva + RME_Q_PI(q));
bfa_regs->rme_q_ci[i] = (kva + RME_Q_CI(q));
bfa_regs->rme_q_depth[i] = (kva + RME_Q_DEPTH(q));
}
} }
void void
...@@ -115,18 +97,18 @@ bfa_hwcb_msix_init(struct bfa_s *bfa, int nvecs) ...@@ -115,18 +97,18 @@ bfa_hwcb_msix_init(struct bfa_s *bfa, int nvecs)
bfa->msix.nvecs = nvecs; bfa->msix.nvecs = nvecs;
if (nvecs == 1) { if (nvecs == 1) {
for (i = 0; i < BFA_MSIX_CB_MAX; i++) for (i = 0; i < BFI_MSIX_CB_MAX; i++)
bfa->msix.handler[i] = bfa_msix_all; bfa->msix.handler[i] = bfa_msix_all;
return; return;
} }
for (i = BFA_MSIX_CPE_Q0; i <= BFA_MSIX_CPE_Q7; i++) for (i = BFI_MSIX_CPE_QMIN_CB; i <= BFI_MSIX_CPE_QMAX_CB; i++)
bfa->msix.handler[i] = bfa_msix_reqq; bfa->msix.handler[i] = bfa_msix_reqq;
for (i = BFA_MSIX_RME_Q0; i <= BFA_MSIX_RME_Q7; i++) for (i = BFI_MSIX_RME_QMIN_CB; i <= BFI_MSIX_RME_QMAX_CB; i++)
bfa->msix.handler[i] = bfa_msix_rspq; bfa->msix.handler[i] = bfa_msix_rspq;
for (; i < BFA_MSIX_CB_MAX; i++) for (; i < BFI_MSIX_CB_MAX; i++)
bfa->msix.handler[i] = bfa_msix_lpu_err; bfa->msix.handler[i] = bfa_msix_lpu_err;
} }
...@@ -156,6 +138,6 @@ bfa_hwcb_isr_mode_set(struct bfa_s *bfa, bfa_boolean_t msix) ...@@ -156,6 +138,6 @@ bfa_hwcb_isr_mode_set(struct bfa_s *bfa, bfa_boolean_t msix)
void void
bfa_hwcb_msix_get_rme_range(struct bfa_s *bfa, u32 *start, u32 *end) bfa_hwcb_msix_get_rme_range(struct bfa_s *bfa, u32 *start, u32 *end)
{ {
*start = BFA_MSIX_RME_Q0; *start = BFI_MSIX_RME_QMIN_CB;
*end = BFA_MSIX_RME_Q7; *end = BFI_MSIX_RME_QMAX_CB;
} }
...@@ -17,29 +17,10 @@ ...@@ -17,29 +17,10 @@
#include "bfad_drv.h" #include "bfad_drv.h"
#include "bfa_modules.h" #include "bfa_modules.h"
#include "bfi_ctreg.h" #include "bfi_reg.h"
BFA_TRC_FILE(HAL, IOCFC_CT); BFA_TRC_FILE(HAL, IOCFC_CT);
static u32 __ct_msix_err_vec_reg[] = {
HOST_MSIX_ERR_INDEX_FN0,
HOST_MSIX_ERR_INDEX_FN1,
HOST_MSIX_ERR_INDEX_FN2,
HOST_MSIX_ERR_INDEX_FN3,
};
static void
bfa_hwct_msix_lpu_err_set(struct bfa_s *bfa, bfa_boolean_t msix, int vec)
{
int fn = bfa_ioc_pcifn(&bfa->ioc);
void __iomem *kva = bfa_ioc_bar0(&bfa->ioc);
if (msix)
writel(vec, kva + __ct_msix_err_vec_reg[fn]);
else
writel(0, kva + __ct_msix_err_vec_reg[fn]);
}
/* /*
* Dummy interrupt handler for handling spurious interrupt during chip-reinit. * Dummy interrupt handler for handling spurious interrupt during chip-reinit.
*/ */
...@@ -53,7 +34,7 @@ bfa_hwct_reginit(struct bfa_s *bfa) ...@@ -53,7 +34,7 @@ bfa_hwct_reginit(struct bfa_s *bfa)
{ {
struct bfa_iocfc_regs_s *bfa_regs = &bfa->iocfc.bfa_regs; struct bfa_iocfc_regs_s *bfa_regs = &bfa->iocfc.bfa_regs;
void __iomem *kva = bfa_ioc_bar0(&bfa->ioc); void __iomem *kva = bfa_ioc_bar0(&bfa->ioc);
int i, q, fn = bfa_ioc_pcifn(&bfa->ioc); int fn = bfa_ioc_pcifn(&bfa->ioc);
if (fn == 0) { if (fn == 0) {
bfa_regs->intr_status = (kva + HOSTFN0_INT_STATUS); bfa_regs->intr_status = (kva + HOSTFN0_INT_STATUS);
...@@ -62,26 +43,16 @@ bfa_hwct_reginit(struct bfa_s *bfa) ...@@ -62,26 +43,16 @@ bfa_hwct_reginit(struct bfa_s *bfa)
bfa_regs->intr_status = (kva + HOSTFN1_INT_STATUS); bfa_regs->intr_status = (kva + HOSTFN1_INT_STATUS);
bfa_regs->intr_mask = (kva + HOSTFN1_INT_MSK); bfa_regs->intr_mask = (kva + HOSTFN1_INT_MSK);
} }
}
for (i = 0; i < BFI_IOC_MAX_CQS; i++) { void
/* bfa_hwct2_reginit(struct bfa_s *bfa)
* CPE registers {
*/ struct bfa_iocfc_regs_s *bfa_regs = &bfa->iocfc.bfa_regs;
q = CPE_Q_NUM(fn, i); void __iomem *kva = bfa_ioc_bar0(&bfa->ioc);
bfa_regs->cpe_q_pi[i] = (kva + CPE_PI_PTR_Q(q << 5));
bfa_regs->cpe_q_ci[i] = (kva + CPE_CI_PTR_Q(q << 5)); bfa_regs->intr_status = (kva + CT2_HOSTFN_INT_STATUS);
bfa_regs->cpe_q_depth[i] = (kva + CPE_DEPTH_Q(q << 5)); bfa_regs->intr_mask = (kva + CT2_HOSTFN_INTR_MASK);
bfa_regs->cpe_q_ctrl[i] = (kva + CPE_QCTRL_Q(q << 5));
/*
* RME registers
*/
q = CPE_Q_NUM(fn, i);
bfa_regs->rme_q_pi[i] = (kva + RME_PI_PTR_Q(q << 5));
bfa_regs->rme_q_ci[i] = (kva + RME_CI_PTR_Q(q << 5));
bfa_regs->rme_q_depth[i] = (kva + RME_DEPTH_Q(q << 5));
bfa_regs->rme_q_ctrl[i] = (kva + RME_QCTRL_Q(q << 5));
}
} }
void void
...@@ -106,9 +77,9 @@ void ...@@ -106,9 +77,9 @@ void
bfa_hwct_msix_getvecs(struct bfa_s *bfa, u32 *msix_vecs_bmap, bfa_hwct_msix_getvecs(struct bfa_s *bfa, u32 *msix_vecs_bmap,
u32 *num_vecs, u32 *max_vec_bit) u32 *num_vecs, u32 *max_vec_bit)
{ {
*msix_vecs_bmap = (1 << BFA_MSIX_CT_MAX) - 1; *msix_vecs_bmap = (1 << BFI_MSIX_CT_MAX) - 1;
*max_vec_bit = (1 << (BFA_MSIX_CT_MAX - 1)); *max_vec_bit = (1 << (BFI_MSIX_CT_MAX - 1));
*num_vecs = BFA_MSIX_CT_MAX; *num_vecs = BFI_MSIX_CT_MAX;
} }
/* /*
...@@ -117,7 +88,7 @@ bfa_hwct_msix_getvecs(struct bfa_s *bfa, u32 *msix_vecs_bmap, ...@@ -117,7 +88,7 @@ bfa_hwct_msix_getvecs(struct bfa_s *bfa, u32 *msix_vecs_bmap,
void void
bfa_hwct_msix_init(struct bfa_s *bfa, int nvecs) bfa_hwct_msix_init(struct bfa_s *bfa, int nvecs)
{ {
WARN_ON((nvecs != 1) && (nvecs != BFA_MSIX_CT_MAX)); WARN_ON((nvecs != 1) && (nvecs != BFI_MSIX_CT_MAX));
bfa_trc(bfa, nvecs); bfa_trc(bfa, nvecs);
bfa->msix.nvecs = nvecs; bfa->msix.nvecs = nvecs;
...@@ -133,19 +104,18 @@ bfa_hwct_msix_install(struct bfa_s *bfa) ...@@ -133,19 +104,18 @@ bfa_hwct_msix_install(struct bfa_s *bfa)
return; return;
if (bfa->msix.nvecs == 1) { if (bfa->msix.nvecs == 1) {
for (i = 0; i < BFA_MSIX_CT_MAX; i++) for (i = 0; i < BFI_MSIX_CT_MAX; i++)
bfa->msix.handler[i] = bfa_msix_all; bfa->msix.handler[i] = bfa_msix_all;
return; return;
} }
for (i = BFA_MSIX_CPE_Q0; i <= BFA_MSIX_CPE_Q3; i++) for (i = BFI_MSIX_CPE_QMIN_CT; i <= BFI_MSIX_CPE_QMAX_CT; i++)
bfa->msix.handler[i] = bfa_msix_reqq; bfa->msix.handler[i] = bfa_msix_reqq;
for (; i <= BFA_MSIX_RME_Q3; i++) for (i = BFI_MSIX_RME_QMIN_CT; i <= BFI_MSIX_RME_QMAX_CT; i++)
bfa->msix.handler[i] = bfa_msix_rspq; bfa->msix.handler[i] = bfa_msix_rspq;
WARN_ON(i != BFA_MSIX_LPU_ERR); bfa->msix.handler[BFI_MSIX_LPU_ERR_CT] = bfa_msix_lpu_err;
bfa->msix.handler[BFA_MSIX_LPU_ERR] = bfa_msix_lpu_err;
} }
void void
...@@ -153,7 +123,7 @@ bfa_hwct_msix_uninstall(struct bfa_s *bfa) ...@@ -153,7 +123,7 @@ bfa_hwct_msix_uninstall(struct bfa_s *bfa)
{ {
int i; int i;
for (i = 0; i < BFA_MSIX_CT_MAX; i++) for (i = 0; i < BFI_MSIX_CT_MAX; i++)
bfa->msix.handler[i] = bfa_hwct_msix_dummy; bfa->msix.handler[i] = bfa_hwct_msix_dummy;
} }
...@@ -164,13 +134,12 @@ void ...@@ -164,13 +134,12 @@ void
bfa_hwct_isr_mode_set(struct bfa_s *bfa, bfa_boolean_t msix) bfa_hwct_isr_mode_set(struct bfa_s *bfa, bfa_boolean_t msix)
{ {
bfa_trc(bfa, 0); bfa_trc(bfa, 0);
bfa_hwct_msix_lpu_err_set(bfa, msix, BFA_MSIX_LPU_ERR);
bfa_ioc_isr_mode_set(&bfa->ioc, msix); bfa_ioc_isr_mode_set(&bfa->ioc, msix);
} }
void void
bfa_hwct_msix_get_rme_range(struct bfa_s *bfa, u32 *start, u32 *end) bfa_hwct_msix_get_rme_range(struct bfa_s *bfa, u32 *start, u32 *end)
{ {
*start = BFA_MSIX_RME_Q0; *start = BFI_MSIX_RME_QMIN_CT;
*end = BFA_MSIX_RME_Q3; *end = BFI_MSIX_RME_QMAX_CT;
} }
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
#include "bfad_drv.h" #include "bfad_drv.h"
#include "bfa_ioc.h" #include "bfa_ioc.h"
#include "bfi_ctreg.h" #include "bfi_reg.h"
#include "bfa_defs.h" #include "bfa_defs.h"
#include "bfa_defs_svc.h" #include "bfa_defs_svc.h"
...@@ -1219,13 +1219,13 @@ bfa_ioc_sem_get(void __iomem *sem_reg) ...@@ -1219,13 +1219,13 @@ bfa_ioc_sem_get(void __iomem *sem_reg)
r32 = readl(sem_reg); r32 = readl(sem_reg);
while (r32 && (cnt < BFA_SEM_SPINCNT)) { while ((r32 & 1) && (cnt < BFA_SEM_SPINCNT)) {
cnt++; cnt++;
udelay(2); udelay(2);
r32 = readl(sem_reg); r32 = readl(sem_reg);
} }
if (r32 == 0) if (!(r32 & 1))
return BFA_TRUE; return BFA_TRUE;
WARN_ON(cnt >= BFA_SEM_SPINCNT); WARN_ON(cnt >= BFA_SEM_SPINCNT);
...@@ -1242,7 +1242,7 @@ bfa_ioc_hw_sem_get(struct bfa_ioc_s *ioc) ...@@ -1242,7 +1242,7 @@ bfa_ioc_hw_sem_get(struct bfa_ioc_s *ioc)
* will return 1. Semaphore is released by writing 1 to the register * will return 1. Semaphore is released by writing 1 to the register
*/ */
r32 = readl(ioc->ioc_regs.ioc_sem_reg); r32 = readl(ioc->ioc_regs.ioc_sem_reg);
if (r32 == 0) { if (!(r32 & 1)) {
bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_SEMLOCKED); bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_SEMLOCKED);
return; return;
} }
...@@ -1351,7 +1351,7 @@ bfa_ioc_fwver_cmp(struct bfa_ioc_s *ioc, struct bfi_ioc_image_hdr_s *fwhdr) ...@@ -1351,7 +1351,7 @@ bfa_ioc_fwver_cmp(struct bfa_ioc_s *ioc, struct bfi_ioc_image_hdr_s *fwhdr)
int i; int i;
drv_fwhdr = (struct bfi_ioc_image_hdr_s *) drv_fwhdr = (struct bfi_ioc_image_hdr_s *)
bfa_cb_image_get_chunk(BFA_IOC_FWIMG_TYPE(ioc), 0); bfa_cb_image_get_chunk(bfa_ioc_asic_gen(ioc), 0);
for (i = 0; i < BFI_IOC_MD5SUM_SZ; i++) { for (i = 0; i < BFI_IOC_MD5SUM_SZ; i++) {
if (fwhdr->md5sum[i] != drv_fwhdr->md5sum[i]) { if (fwhdr->md5sum[i] != drv_fwhdr->md5sum[i]) {
...@@ -1377,7 +1377,7 @@ bfa_ioc_fwver_valid(struct bfa_ioc_s *ioc, u32 boot_env) ...@@ -1377,7 +1377,7 @@ bfa_ioc_fwver_valid(struct bfa_ioc_s *ioc, u32 boot_env)
bfa_ioc_fwver_get(ioc, &fwhdr); bfa_ioc_fwver_get(ioc, &fwhdr);
drv_fwhdr = (struct bfi_ioc_image_hdr_s *) drv_fwhdr = (struct bfi_ioc_image_hdr_s *)
bfa_cb_image_get_chunk(BFA_IOC_FWIMG_TYPE(ioc), 0); bfa_cb_image_get_chunk(bfa_ioc_asic_gen(ioc), 0);
if (fwhdr.signature != drv_fwhdr->signature) { if (fwhdr.signature != drv_fwhdr->signature) {
bfa_trc(ioc, fwhdr.signature); bfa_trc(ioc, fwhdr.signature);
...@@ -1385,8 +1385,8 @@ bfa_ioc_fwver_valid(struct bfa_ioc_s *ioc, u32 boot_env) ...@@ -1385,8 +1385,8 @@ bfa_ioc_fwver_valid(struct bfa_ioc_s *ioc, u32 boot_env)
return BFA_FALSE; return BFA_FALSE;
} }
if (swab32(fwhdr.param) != boot_env) { if (swab32(fwhdr.bootenv) != boot_env) {
bfa_trc(ioc, fwhdr.param); bfa_trc(ioc, fwhdr.bootenv);
bfa_trc(ioc, boot_env); bfa_trc(ioc, boot_env);
return BFA_FALSE; return BFA_FALSE;
} }
...@@ -1422,8 +1422,8 @@ bfa_ioc_hwinit(struct bfa_ioc_s *ioc, bfa_boolean_t force) ...@@ -1422,8 +1422,8 @@ bfa_ioc_hwinit(struct bfa_ioc_s *ioc, bfa_boolean_t force)
bfa_trc(ioc, ioc_fwstate); bfa_trc(ioc, ioc_fwstate);
boot_type = BFI_BOOT_TYPE_NORMAL; boot_type = BFI_FWBOOT_TYPE_NORMAL;
boot_env = BFI_BOOT_LOADER_OS; boot_env = BFI_FWBOOT_ENV_OS;
/* /*
* check if firmware is valid * check if firmware is valid
...@@ -1580,25 +1580,26 @@ bfa_ioc_download_fw(struct bfa_ioc_s *ioc, u32 boot_type, ...@@ -1580,25 +1580,26 @@ bfa_ioc_download_fw(struct bfa_ioc_s *ioc, u32 boot_type,
u32 loff = 0; u32 loff = 0;
u32 chunkno = 0; u32 chunkno = 0;
u32 i; u32 i;
u32 asicmode;
/* /*
* Initialize LMEM first before code download * Initialize LMEM first before code download
*/ */
bfa_ioc_lmem_init(ioc); bfa_ioc_lmem_init(ioc);
bfa_trc(ioc, bfa_cb_image_get_size(BFA_IOC_FWIMG_TYPE(ioc))); bfa_trc(ioc, bfa_cb_image_get_size(bfa_ioc_asic_gen(ioc)));
fwimg = bfa_cb_image_get_chunk(BFA_IOC_FWIMG_TYPE(ioc), chunkno); fwimg = bfa_cb_image_get_chunk(bfa_ioc_asic_gen(ioc), chunkno);
pgnum = PSS_SMEM_PGNUM(ioc->ioc_regs.smem_pg0, loff); pgnum = PSS_SMEM_PGNUM(ioc->ioc_regs.smem_pg0, loff);
pgoff = PSS_SMEM_PGOFF(loff); pgoff = PSS_SMEM_PGOFF(loff);
writel(pgnum, ioc->ioc_regs.host_page_num_fn); writel(pgnum, ioc->ioc_regs.host_page_num_fn);
for (i = 0; i < bfa_cb_image_get_size(BFA_IOC_FWIMG_TYPE(ioc)); i++) { for (i = 0; i < bfa_cb_image_get_size(bfa_ioc_asic_gen(ioc)); i++) {
if (BFA_IOC_FLASH_CHUNK_NO(i) != chunkno) { if (BFA_IOC_FLASH_CHUNK_NO(i) != chunkno) {
chunkno = BFA_IOC_FLASH_CHUNK_NO(i); chunkno = BFA_IOC_FLASH_CHUNK_NO(i);
fwimg = bfa_cb_image_get_chunk(BFA_IOC_FWIMG_TYPE(ioc), fwimg = bfa_cb_image_get_chunk(bfa_ioc_asic_gen(ioc),
BFA_IOC_FLASH_CHUNK_ADDR(chunkno)); BFA_IOC_FLASH_CHUNK_ADDR(chunkno));
} }
...@@ -1624,11 +1625,15 @@ bfa_ioc_download_fw(struct bfa_ioc_s *ioc, u32 boot_type, ...@@ -1624,11 +1625,15 @@ bfa_ioc_download_fw(struct bfa_ioc_s *ioc, u32 boot_type,
ioc->ioc_regs.host_page_num_fn); ioc->ioc_regs.host_page_num_fn);
/* /*
* Set boot type and boot param at the end. * Set boot type and device mode at the end.
*/ */
bfa_mem_write(ioc->ioc_regs.smem_page_start, BFI_BOOT_TYPE_OFF, asicmode = BFI_FWBOOT_DEVMODE(ioc->asic_gen, ioc->asic_mode,
ioc->port0_mode, ioc->port1_mode);
bfa_mem_write(ioc->ioc_regs.smem_page_start, BFI_FWBOOT_DEVMODE_OFF,
swab32(asicmode));
bfa_mem_write(ioc->ioc_regs.smem_page_start, BFI_FWBOOT_TYPE_OFF,
swab32(boot_type)); swab32(boot_type));
bfa_mem_write(ioc->ioc_regs.smem_page_start, BFI_BOOT_LOADER_OFF, bfa_mem_write(ioc->ioc_regs.smem_page_start, BFI_FWBOOT_ENV_OFF,
swab32(boot_env)); swab32(boot_env));
} }
...@@ -1879,8 +1884,6 @@ bfa_ioc_pll_init(struct bfa_ioc_s *ioc) ...@@ -1879,8 +1884,6 @@ bfa_ioc_pll_init(struct bfa_ioc_s *ioc)
void void
bfa_ioc_boot(struct bfa_ioc_s *ioc, u32 boot_type, u32 boot_env) bfa_ioc_boot(struct bfa_ioc_s *ioc, u32 boot_type, u32 boot_env)
{ {
void __iomem *rb;
bfa_ioc_stats(ioc, ioc_boots); bfa_ioc_stats(ioc, ioc_boots);
if (bfa_ioc_pll_init(ioc) != BFA_STATUS_OK) if (bfa_ioc_pll_init(ioc) != BFA_STATUS_OK)
...@@ -1889,13 +1892,12 @@ bfa_ioc_boot(struct bfa_ioc_s *ioc, u32 boot_type, u32 boot_env) ...@@ -1889,13 +1892,12 @@ bfa_ioc_boot(struct bfa_ioc_s *ioc, u32 boot_type, u32 boot_env)
/* /*
* Initialize IOC state of all functions on a chip reset. * Initialize IOC state of all functions on a chip reset.
*/ */
rb = ioc->pcidev.pci_bar_kva; if (boot_type == BFI_FWBOOT_TYPE_MEMTEST) {
if (boot_type == BFI_BOOT_TYPE_MEMTEST) { writel(BFI_IOC_MEMTEST, ioc->ioc_regs.ioc_fwstate);
writel(BFI_IOC_MEMTEST, (rb + BFA_IOC0_STATE_REG)); writel(BFI_IOC_MEMTEST, ioc->ioc_regs.alt_ioc_fwstate);
writel(BFI_IOC_MEMTEST, (rb + BFA_IOC1_STATE_REG));
} else { } else {
writel(BFI_IOC_INITING, (rb + BFA_IOC0_STATE_REG)); writel(BFI_IOC_INITING, ioc->ioc_regs.ioc_fwstate);
writel(BFI_IOC_INITING, (rb + BFA_IOC1_STATE_REG)); writel(BFI_IOC_INITING, ioc->ioc_regs.alt_ioc_fwstate);
} }
bfa_ioc_msgflush(ioc); bfa_ioc_msgflush(ioc);
...@@ -1935,13 +1937,17 @@ bfa_ioc_is_initialized(struct bfa_ioc_s *ioc) ...@@ -1935,13 +1937,17 @@ bfa_ioc_is_initialized(struct bfa_ioc_s *ioc)
(r32 != BFI_IOC_MEMTEST)); (r32 != BFI_IOC_MEMTEST));
} }
void bfa_boolean_t
bfa_ioc_msgget(struct bfa_ioc_s *ioc, void *mbmsg) bfa_ioc_msgget(struct bfa_ioc_s *ioc, void *mbmsg)
{ {
__be32 *msgp = mbmsg; __be32 *msgp = mbmsg;
u32 r32; u32 r32;
int i; int i;
r32 = readl(ioc->ioc_regs.lpu_mbox_cmd);
if ((r32 & 1) == 0)
return BFA_FALSE;
/* /*
* read the MBOX msg * read the MBOX msg
*/ */
...@@ -1957,6 +1963,8 @@ bfa_ioc_msgget(struct bfa_ioc_s *ioc, void *mbmsg) ...@@ -1957,6 +1963,8 @@ bfa_ioc_msgget(struct bfa_ioc_s *ioc, void *mbmsg)
*/ */
writel(1, ioc->ioc_regs.lpu_mbox_cmd); writel(1, ioc->ioc_regs.lpu_mbox_cmd);
readl(ioc->ioc_regs.lpu_mbox_cmd); readl(ioc->ioc_regs.lpu_mbox_cmd);
return BFA_TRUE;
} }
void void
...@@ -2040,16 +2048,55 @@ bfa_ioc_pci_init(struct bfa_ioc_s *ioc, struct bfa_pcidev_s *pcidev, ...@@ -2040,16 +2048,55 @@ bfa_ioc_pci_init(struct bfa_ioc_s *ioc, struct bfa_pcidev_s *pcidev,
{ {
ioc->clscode = clscode; ioc->clscode = clscode;
ioc->pcidev = *pcidev; ioc->pcidev = *pcidev;
ioc->ctdev = bfa_asic_id_ct(ioc->pcidev.device_id);
ioc->cna = ioc->ctdev && !ioc->fcmode; /*
* Initialize IOC and device personality
*/
ioc->port0_mode = ioc->port1_mode = BFI_PORT_MODE_FC;
ioc->asic_mode = BFI_ASIC_MODE_FC;
switch (pcidev->device_id) {
case BFA_PCI_DEVICE_ID_FC_8G1P:
case BFA_PCI_DEVICE_ID_FC_8G2P:
ioc->asic_gen = BFI_ASIC_GEN_CB;
break;
case BFA_PCI_DEVICE_ID_CT:
ioc->asic_gen = BFI_ASIC_GEN_CT;
ioc->port0_mode = ioc->port1_mode = BFI_PORT_MODE_ETH;
ioc->asic_mode = BFI_ASIC_MODE_ETH;
break;
case BFA_PCI_DEVICE_ID_CT_FC:
ioc->asic_gen = BFI_ASIC_GEN_CT;
break;
case BFA_PCI_DEVICE_ID_CT2:
ioc->asic_gen = BFI_ASIC_GEN_CT2;
if (clscode == BFI_PCIFN_CLASS_FC)
ioc->asic_mode = BFI_ASIC_MODE_FC16;
else {
ioc->port0_mode = ioc->port1_mode = BFI_PORT_MODE_ETH;
ioc->asic_mode = BFI_ASIC_MODE_ETH;
}
break;
default:
WARN_ON(1);
}
/* /*
* Set asic specific interfaces. See bfa_ioc_cb.c and bfa_ioc_ct.c * Set asic specific interfaces. See bfa_ioc_cb.c and bfa_ioc_ct.c
*/ */
if (ioc->ctdev) if (ioc->asic_gen == BFI_ASIC_GEN_CB)
bfa_ioc_set_ct_hwif(ioc);
else
bfa_ioc_set_cb_hwif(ioc); bfa_ioc_set_cb_hwif(ioc);
else if (ioc->asic_gen == BFI_ASIC_GEN_CT)
bfa_ioc_set_ct_hwif(ioc);
else {
WARN_ON(ioc->asic_gen != BFI_ASIC_GEN_CT2);
bfa_ioc_set_ct2_hwif(ioc);
bfa_ioc_ct2_poweron(ioc);
}
bfa_ioc_map_port(ioc); bfa_ioc_map_port(ioc);
bfa_ioc_reg_init(ioc); bfa_ioc_reg_init(ioc);
...@@ -2175,7 +2222,8 @@ bfa_ioc_mbox_isr(struct bfa_ioc_s *ioc) ...@@ -2175,7 +2222,8 @@ bfa_ioc_mbox_isr(struct bfa_ioc_s *ioc)
struct bfi_mbmsg_s m; struct bfi_mbmsg_s m;
int mc; int mc;
bfa_ioc_msgget(ioc, &m); if (!bfa_ioc_msgget(ioc, &m))
return;
/* /*
* Treat IOC message class as special. * Treat IOC message class as special.
...@@ -2202,7 +2250,6 @@ void ...@@ -2202,7 +2250,6 @@ void
bfa_ioc_set_fcmode(struct bfa_ioc_s *ioc) bfa_ioc_set_fcmode(struct bfa_ioc_s *ioc)
{ {
ioc->fcmode = BFA_TRUE; ioc->fcmode = BFA_TRUE;
ioc->port_id = bfa_ioc_pcifn(ioc);
} }
/* /*
...@@ -2242,17 +2289,16 @@ bfa_boolean_t ...@@ -2242,17 +2289,16 @@ bfa_boolean_t
bfa_ioc_adapter_is_disabled(struct bfa_ioc_s *ioc) bfa_ioc_adapter_is_disabled(struct bfa_ioc_s *ioc)
{ {
u32 ioc_state; u32 ioc_state;
void __iomem *rb = ioc->pcidev.pci_bar_kva;
if (!bfa_fsm_cmp_state(ioc, bfa_ioc_sm_disabled)) if (!bfa_fsm_cmp_state(ioc, bfa_ioc_sm_disabled))
return BFA_FALSE; return BFA_FALSE;
ioc_state = readl(rb + BFA_IOC0_STATE_REG); ioc_state = readl(ioc->ioc_regs.ioc_fwstate);
if (!bfa_ioc_state_disabled(ioc_state)) if (!bfa_ioc_state_disabled(ioc_state))
return BFA_FALSE; return BFA_FALSE;
if (ioc->pcidev.device_id != BFA_PCI_DEVICE_ID_FC_8G1P) { if (ioc->pcidev.device_id != BFA_PCI_DEVICE_ID_FC_8G1P) {
ioc_state = readl(rb + BFA_IOC1_STATE_REG); ioc_state = readl(ioc->ioc_regs.alt_ioc_fwstate);
if (!bfa_ioc_state_disabled(ioc_state)) if (!bfa_ioc_state_disabled(ioc_state))
return BFA_FALSE; return BFA_FALSE;
} }
...@@ -2311,22 +2357,24 @@ bfa_ioc_get_adapter_attr(struct bfa_ioc_s *ioc, ...@@ -2311,22 +2357,24 @@ bfa_ioc_get_adapter_attr(struct bfa_ioc_s *ioc,
bfa_ioc_get_pci_chip_rev(ioc, ad_attr->hw_ver); bfa_ioc_get_pci_chip_rev(ioc, ad_attr->hw_ver);
ad_attr->cna_capable = ioc->cna; ad_attr->cna_capable = bfa_ioc_is_cna(ioc);
ad_attr->trunk_capable = (ad_attr->nports > 1) && !ioc->cna && ad_attr->trunk_capable = (ad_attr->nports > 1) &&
!ad_attr->is_mezz; !bfa_ioc_is_cna(ioc) && !ad_attr->is_mezz;
} }
enum bfa_ioc_type_e enum bfa_ioc_type_e
bfa_ioc_get_type(struct bfa_ioc_s *ioc) bfa_ioc_get_type(struct bfa_ioc_s *ioc)
{ {
if (!ioc->ctdev || ioc->fcmode) enum bfi_port_mode mode;
return BFA_IOC_TYPE_FC;
else if (ioc->clscode == BFI_PCIFN_CLASS_FC) if (ioc->clscode == BFI_PCIFN_CLASS_ETH)
return BFA_IOC_TYPE_FCoE;
else {
WARN_ON(ioc->clscode != BFI_PCIFN_CLASS_ETH);
return BFA_IOC_TYPE_LL; return BFA_IOC_TYPE_LL;
}
WARN_ON(ioc->clscode != BFI_PCIFN_CLASS_FC);
mode = (ioc->port_id == 0) ? ioc->port0_mode : ioc->port1_mode;
return (mode == BFI_PORT_MODE_FC)
? BFA_IOC_TYPE_FC : BFA_IOC_TYPE_FCoE;
} }
void void
...@@ -2479,7 +2527,7 @@ bfa_ioc_get_mfg_mac(struct bfa_ioc_s *ioc) ...@@ -2479,7 +2527,7 @@ bfa_ioc_get_mfg_mac(struct bfa_ioc_s *ioc)
bfa_boolean_t bfa_boolean_t
bfa_ioc_get_fcmode(struct bfa_ioc_s *ioc) bfa_ioc_get_fcmode(struct bfa_ioc_s *ioc)
{ {
return ioc->fcmode || !bfa_asic_id_ct(ioc->pcidev.device_id); return ioc->fcmode || bfa_asic_id_cb(ioc->pcidev.device_id);
} }
/* /*
......
...@@ -246,8 +246,6 @@ struct bfa_ioc_s { ...@@ -246,8 +246,6 @@ struct bfa_ioc_s {
struct bfa_trc_mod_s *trcmod; struct bfa_trc_mod_s *trcmod;
struct bfa_ioc_drv_stats_s stats; struct bfa_ioc_drv_stats_s stats;
bfa_boolean_t fcmode; bfa_boolean_t fcmode;
bfa_boolean_t ctdev;
bfa_boolean_t cna;
bfa_boolean_t pllinit; bfa_boolean_t pllinit;
bfa_boolean_t stats_busy; /* outstanding stats */ bfa_boolean_t stats_busy; /* outstanding stats */
u8 port_id; u8 port_id;
...@@ -257,10 +255,14 @@ struct bfa_ioc_s { ...@@ -257,10 +255,14 @@ struct bfa_ioc_s {
struct bfa_ioc_mbox_mod_s mbox_mod; struct bfa_ioc_mbox_mod_s mbox_mod;
struct bfa_ioc_hwif_s *ioc_hwif; struct bfa_ioc_hwif_s *ioc_hwif;
struct bfa_iocpf_s iocpf; struct bfa_iocpf_s iocpf;
enum bfi_asic_gen asic_gen;
enum bfi_asic_mode asic_mode;
enum bfi_port_mode port0_mode;
enum bfi_port_mode port1_mode;
}; };
struct bfa_ioc_hwif_s { struct bfa_ioc_hwif_s {
bfa_status_t (*ioc_pll_init) (void __iomem *rb, bfa_boolean_t fcmode); bfa_status_t (*ioc_pll_init) (void __iomem *rb, enum bfi_asic_mode m);
bfa_boolean_t (*ioc_firmware_lock) (struct bfa_ioc_s *ioc); bfa_boolean_t (*ioc_firmware_lock) (struct bfa_ioc_s *ioc);
void (*ioc_firmware_unlock) (struct bfa_ioc_s *ioc); void (*ioc_firmware_unlock) (struct bfa_ioc_s *ioc);
void (*ioc_reg_init) (struct bfa_ioc_s *ioc); void (*ioc_reg_init) (struct bfa_ioc_s *ioc);
...@@ -280,6 +282,10 @@ struct bfa_ioc_hwif_s { ...@@ -280,6 +282,10 @@ struct bfa_ioc_hwif_s {
#define bfa_ioc_devid(__ioc) ((__ioc)->pcidev.device_id) #define bfa_ioc_devid(__ioc) ((__ioc)->pcidev.device_id)
#define bfa_ioc_bar0(__ioc) ((__ioc)->pcidev.pci_bar_kva) #define bfa_ioc_bar0(__ioc) ((__ioc)->pcidev.pci_bar_kva)
#define bfa_ioc_portid(__ioc) ((__ioc)->port_id) #define bfa_ioc_portid(__ioc) ((__ioc)->port_id)
#define bfa_ioc_asic_gen(__ioc) ((__ioc)->asic_gen)
#define bfa_ioc_is_cna(__ioc) \
((bfa_ioc_get_type(ioc) == BFA_IOC_TYPE_FCoE) || \
(bfa_ioc_get_type(ioc) == BFA_IOC_TYPE_LL))
#define bfa_ioc_fetch_stats(__ioc, __stats) \ #define bfa_ioc_fetch_stats(__ioc, __stats) \
(((__stats)->drv_stats) = (__ioc)->stats) (((__stats)->drv_stats) = (__ioc)->stats)
#define bfa_ioc_clr_stats(__ioc) \ #define bfa_ioc_clr_stats(__ioc) \
...@@ -293,12 +299,9 @@ struct bfa_ioc_hwif_s { ...@@ -293,12 +299,9 @@ struct bfa_ioc_hwif_s {
#define bfa_ioc_stats(_ioc, _stats) ((_ioc)->stats._stats++) #define bfa_ioc_stats(_ioc, _stats) ((_ioc)->stats._stats++)
#define BFA_IOC_FWIMG_MINSZ (16 * 1024) #define BFA_IOC_FWIMG_MINSZ (16 * 1024)
#define BFA_IOC_FWIMG_TYPE(__ioc) \ #define BFA_IOC_FW_SMEM_SIZE(__ioc) \
(((__ioc)->ctdev) ? \ ((bfa_ioc_asic_gen(__ioc) == BFI_ASIC_GEN_CB) \
(((__ioc)->fcmode) ? BFI_IMAGE_CT_FC : BFI_IMAGE_CT_CNA) : \ ? BFI_SMEM_CB_SIZE : BFI_SMEM_CT_SIZE)
BFI_IMAGE_CB_FC)
#define BFA_IOC_FW_SMEM_SIZE(__ioc) \
(((__ioc)->ctdev) ? BFI_SMEM_CT_SIZE : BFI_SMEM_CB_SIZE)
#define BFA_IOC_FLASH_CHUNK_NO(off) (off / BFI_FLASH_CHUNK_SZ_WORDS) #define BFA_IOC_FLASH_CHUNK_NO(off) (off / BFI_FLASH_CHUNK_SZ_WORDS)
#define BFA_IOC_FLASH_OFFSET_IN_CHUNK(off) (off % BFI_FLASH_CHUNK_SZ_WORDS) #define BFA_IOC_FLASH_OFFSET_IN_CHUNK(off) (off % BFI_FLASH_CHUNK_SZ_WORDS)
#define BFA_IOC_FLASH_CHUNK_ADDR(chunkno) (chunkno * BFI_FLASH_CHUNK_SZ_WORDS) #define BFA_IOC_FLASH_CHUNK_ADDR(chunkno) (chunkno * BFI_FLASH_CHUNK_SZ_WORDS)
...@@ -311,7 +314,7 @@ void bfa_ioc_mbox_register(struct bfa_ioc_s *ioc, ...@@ -311,7 +314,7 @@ void bfa_ioc_mbox_register(struct bfa_ioc_s *ioc,
bfa_ioc_mbox_mcfunc_t *mcfuncs); bfa_ioc_mbox_mcfunc_t *mcfuncs);
void bfa_ioc_mbox_isr(struct bfa_ioc_s *ioc); void bfa_ioc_mbox_isr(struct bfa_ioc_s *ioc);
void bfa_ioc_mbox_send(struct bfa_ioc_s *ioc, void *ioc_msg, int len); void bfa_ioc_mbox_send(struct bfa_ioc_s *ioc, void *ioc_msg, int len);
void bfa_ioc_msgget(struct bfa_ioc_s *ioc, void *mbmsg); bfa_boolean_t bfa_ioc_msgget(struct bfa_ioc_s *ioc, void *mbmsg);
void bfa_ioc_mbox_regisr(struct bfa_ioc_s *ioc, enum bfi_mclass mc, void bfa_ioc_mbox_regisr(struct bfa_ioc_s *ioc, enum bfi_mclass mc,
bfa_ioc_mbox_mcfunc_t cbfn, void *cbarg); bfa_ioc_mbox_mcfunc_t cbfn, void *cbarg);
...@@ -321,21 +324,25 @@ void bfa_ioc_mbox_regisr(struct bfa_ioc_s *ioc, enum bfi_mclass mc, ...@@ -321,21 +324,25 @@ void bfa_ioc_mbox_regisr(struct bfa_ioc_s *ioc, enum bfi_mclass mc,
#define bfa_ioc_pll_init_asic(__ioc) \ #define bfa_ioc_pll_init_asic(__ioc) \
((__ioc)->ioc_hwif->ioc_pll_init((__ioc)->pcidev.pci_bar_kva, \ ((__ioc)->ioc_hwif->ioc_pll_init((__ioc)->pcidev.pci_bar_kva, \
(__ioc)->fcmode)) (__ioc)->asic_mode))
bfa_status_t bfa_ioc_pll_init(struct bfa_ioc_s *ioc); bfa_status_t bfa_ioc_pll_init(struct bfa_ioc_s *ioc);
bfa_status_t bfa_ioc_cb_pll_init(void __iomem *rb, bfa_boolean_t fcmode); bfa_status_t bfa_ioc_cb_pll_init(void __iomem *rb, enum bfi_asic_mode mode);
bfa_boolean_t bfa_ioc_ct_pll_init_complete(void __iomem *rb); bfa_status_t bfa_ioc_ct_pll_init(void __iomem *rb, enum bfi_asic_mode mode);
bfa_status_t bfa_ioc_ct_pll_init(void __iomem *rb, bfa_boolean_t fcmode); bfa_status_t bfa_ioc_ct2_pll_init(void __iomem *rb, enum bfi_asic_mode mode);
#define bfa_ioc_isr_mode_set(__ioc, __msix) \ #define bfa_ioc_isr_mode_set(__ioc, __msix) do { \
((__ioc)->ioc_hwif->ioc_isr_mode_set(__ioc, __msix)) if ((__ioc)->ioc_hwif->ioc_isr_mode_set) \
((__ioc)->ioc_hwif->ioc_isr_mode_set(__ioc, __msix)); \
} while (0)
#define bfa_ioc_ownership_reset(__ioc) \ #define bfa_ioc_ownership_reset(__ioc) \
((__ioc)->ioc_hwif->ioc_ownership_reset(__ioc)) ((__ioc)->ioc_hwif->ioc_ownership_reset(__ioc))
void bfa_ioc_set_ct_hwif(struct bfa_ioc_s *ioc);
void bfa_ioc_set_cb_hwif(struct bfa_ioc_s *ioc); void bfa_ioc_set_cb_hwif(struct bfa_ioc_s *ioc);
void bfa_ioc_set_ct_hwif(struct bfa_ioc_s *ioc);
void bfa_ioc_set_ct2_hwif(struct bfa_ioc_s *ioc);
void bfa_ioc_ct2_poweron(struct bfa_ioc_s *ioc);
void bfa_ioc_attach(struct bfa_ioc_s *ioc, void *bfa, void bfa_ioc_attach(struct bfa_ioc_s *ioc, void *bfa,
struct bfa_ioc_cbfn_s *cbfn, struct bfa_timer_mod_s *timer_mod); struct bfa_ioc_cbfn_s *cbfn, struct bfa_timer_mod_s *timer_mod);
...@@ -349,7 +356,7 @@ void bfa_ioc_disable(struct bfa_ioc_s *ioc); ...@@ -349,7 +356,7 @@ void bfa_ioc_disable(struct bfa_ioc_s *ioc);
bfa_boolean_t bfa_ioc_intx_claim(struct bfa_ioc_s *ioc); bfa_boolean_t bfa_ioc_intx_claim(struct bfa_ioc_s *ioc);
void bfa_ioc_boot(struct bfa_ioc_s *ioc, u32 boot_type, void bfa_ioc_boot(struct bfa_ioc_s *ioc, u32 boot_type,
u32 boot_param); u32 boot_env);
void bfa_ioc_isr(struct bfa_ioc_s *ioc, struct bfi_mbmsg_s *msg); void bfa_ioc_isr(struct bfa_ioc_s *ioc, struct bfi_mbmsg_s *msg);
void bfa_ioc_error_isr(struct bfa_ioc_s *ioc); void bfa_ioc_error_isr(struct bfa_ioc_s *ioc);
bfa_boolean_t bfa_ioc_is_operational(struct bfa_ioc_s *ioc); bfa_boolean_t bfa_ioc_is_operational(struct bfa_ioc_s *ioc);
...@@ -397,50 +404,64 @@ mac_t bfa_ioc_get_mfg_mac(struct bfa_ioc_s *ioc); ...@@ -397,50 +404,64 @@ mac_t bfa_ioc_get_mfg_mac(struct bfa_ioc_s *ioc);
/* /*
* F/W Image Size & Chunk * F/W Image Size & Chunk
*/ */
extern u32 bfi_image_ct_fc_size; extern u32 bfi_image_cb_size;
extern u32 bfi_image_ct_cna_size; extern u32 bfi_image_ct_size;
extern u32 bfi_image_cb_fc_size; extern u32 bfi_image_ct2_size;
extern u32 *bfi_image_ct_fc; extern u32 *bfi_image_cb;
extern u32 *bfi_image_ct_cna; extern u32 *bfi_image_ct;
extern u32 *bfi_image_cb_fc; extern u32 *bfi_image_ct2;
static inline u32 * static inline u32 *
bfi_image_ct_fc_get_chunk(u32 off) bfi_image_cb_get_chunk(u32 off)
{ return (u32 *)(bfi_image_ct_fc + off); } {
return (u32 *)(bfi_image_cb + off);
}
static inline u32 * static inline u32 *
bfi_image_ct_cna_get_chunk(u32 off) bfi_image_ct_get_chunk(u32 off)
{ return (u32 *)(bfi_image_ct_cna + off); } {
return (u32 *)(bfi_image_ct + off);
}
static inline u32 * static inline u32 *
bfi_image_cb_fc_get_chunk(u32 off) bfi_image_ct2_get_chunk(u32 off)
{ return (u32 *)(bfi_image_cb_fc + off); } {
return (u32 *)(bfi_image_ct2 + off);
}
static inline u32* static inline u32*
bfa_cb_image_get_chunk(int type, u32 off) bfa_cb_image_get_chunk(enum bfi_asic_gen asic_gen, u32 off)
{ {
switch (type) { switch (asic_gen) {
case BFI_IMAGE_CT_FC: case BFI_ASIC_GEN_CB:
return bfi_image_ct_fc_get_chunk(off); break; return bfi_image_cb_get_chunk(off);
case BFI_IMAGE_CT_CNA: break;
return bfi_image_ct_cna_get_chunk(off); break; case BFI_ASIC_GEN_CT:
case BFI_IMAGE_CB_FC: return bfi_image_ct_get_chunk(off);
return bfi_image_cb_fc_get_chunk(off); break; break;
default: return NULL; case BFI_ASIC_GEN_CT2:
return bfi_image_ct2_get_chunk(off);
break;
default:
return NULL;
} }
} }
static inline u32 static inline u32
bfa_cb_image_get_size(int type) bfa_cb_image_get_size(enum bfi_asic_gen asic_gen)
{ {
switch (type) { switch (asic_gen) {
case BFI_IMAGE_CT_FC: case BFI_ASIC_GEN_CB:
return bfi_image_ct_fc_size; break; return bfi_image_cb_size;
case BFI_IMAGE_CT_CNA: break;
return bfi_image_ct_cna_size; break; case BFI_ASIC_GEN_CT:
case BFI_IMAGE_CB_FC: return bfi_image_ct_size;
return bfi_image_cb_fc_size; break; break;
default: return 0; case BFI_ASIC_GEN_CT2:
return bfi_image_ct2_size;
break;
default:
return 0;
} }
} }
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
#include "bfad_drv.h" #include "bfad_drv.h"
#include "bfa_ioc.h" #include "bfa_ioc.h"
#include "bfi_cbreg.h" #include "bfi_reg.h"
#include "bfa_defs.h" #include "bfa_defs.h"
BFA_TRC_FILE(CNA, IOC_CB); BFA_TRC_FILE(CNA, IOC_CB);
...@@ -77,7 +77,7 @@ bfa_ioc_cb_firmware_lock(struct bfa_ioc_s *ioc) ...@@ -77,7 +77,7 @@ bfa_ioc_cb_firmware_lock(struct bfa_ioc_s *ioc)
bfa_ioc_fwver_get(ioc, &fwhdr); bfa_ioc_fwver_get(ioc, &fwhdr);
if (swab32(fwhdr.exec) == BFI_BOOT_TYPE_NORMAL) if (swab32(fwhdr.exec) == BFI_FWBOOT_TYPE_NORMAL)
return BFA_TRUE; return BFA_TRUE;
bfa_trc(ioc, fwstate); bfa_trc(ioc, fwstate);
...@@ -98,7 +98,7 @@ bfa_ioc_cb_firmware_unlock(struct bfa_ioc_s *ioc) ...@@ -98,7 +98,7 @@ bfa_ioc_cb_firmware_unlock(struct bfa_ioc_s *ioc)
static void static void
bfa_ioc_cb_notify_fail(struct bfa_ioc_s *ioc) bfa_ioc_cb_notify_fail(struct bfa_ioc_s *ioc)
{ {
writel(__PSS_ERR_STATUS_SET, ioc->ioc_regs.err_set); writel(~0U, ioc->ioc_regs.err_set);
readl(ioc->ioc_regs.err_set); readl(ioc->ioc_regs.err_set);
} }
...@@ -152,8 +152,8 @@ bfa_ioc_cb_reg_init(struct bfa_ioc_s *ioc) ...@@ -152,8 +152,8 @@ bfa_ioc_cb_reg_init(struct bfa_ioc_s *ioc)
*/ */
ioc->ioc_regs.pss_ctl_reg = (rb + PSS_CTL_REG); ioc->ioc_regs.pss_ctl_reg = (rb + PSS_CTL_REG);
ioc->ioc_regs.pss_err_status_reg = (rb + PSS_ERR_STATUS_REG); ioc->ioc_regs.pss_err_status_reg = (rb + PSS_ERR_STATUS_REG);
ioc->ioc_regs.app_pll_fast_ctl_reg = (rb + APP_PLL_400_CTL_REG); ioc->ioc_regs.app_pll_fast_ctl_reg = (rb + APP_PLL_LCLK_CTL_REG);
ioc->ioc_regs.app_pll_slow_ctl_reg = (rb + APP_PLL_212_CTL_REG); ioc->ioc_regs.app_pll_slow_ctl_reg = (rb + APP_PLL_SCLK_CTL_REG);
/* /*
* IOC semaphore registers and serialization * IOC semaphore registers and serialization
...@@ -285,18 +285,18 @@ bfa_ioc_cb_sync_complete(struct bfa_ioc_s *ioc) ...@@ -285,18 +285,18 @@ bfa_ioc_cb_sync_complete(struct bfa_ioc_s *ioc)
} }
bfa_status_t bfa_status_t
bfa_ioc_cb_pll_init(void __iomem *rb, bfa_boolean_t fcmode) bfa_ioc_cb_pll_init(void __iomem *rb, enum bfi_asic_mode fcmode)
{ {
u32 pll_sclk, pll_fclk; u32 pll_sclk, pll_fclk;
pll_sclk = __APP_PLL_212_ENABLE | __APP_PLL_212_LRESETN | pll_sclk = __APP_PLL_SCLK_ENABLE | __APP_PLL_SCLK_LRESETN |
__APP_PLL_212_P0_1(3U) | __APP_PLL_SCLK_P0_1(3U) |
__APP_PLL_212_JITLMT0_1(3U) | __APP_PLL_SCLK_JITLMT0_1(3U) |
__APP_PLL_212_CNTLMT0_1(3U); __APP_PLL_SCLK_CNTLMT0_1(3U);
pll_fclk = __APP_PLL_400_ENABLE | __APP_PLL_400_LRESETN | pll_fclk = __APP_PLL_LCLK_ENABLE | __APP_PLL_LCLK_LRESETN |
__APP_PLL_400_RSEL200500 | __APP_PLL_400_P0_1(3U) | __APP_PLL_LCLK_RSEL200500 | __APP_PLL_LCLK_P0_1(3U) |
__APP_PLL_400_JITLMT0_1(3U) | __APP_PLL_LCLK_JITLMT0_1(3U) |
__APP_PLL_400_CNTLMT0_1(3U); __APP_PLL_LCLK_CNTLMT0_1(3U);
writel(BFI_IOC_UNINIT, (rb + BFA_IOC0_STATE_REG)); writel(BFI_IOC_UNINIT, (rb + BFA_IOC0_STATE_REG));
writel(BFI_IOC_UNINIT, (rb + BFA_IOC1_STATE_REG)); writel(BFI_IOC_UNINIT, (rb + BFA_IOC1_STATE_REG));
writel(0xffffffffU, (rb + HOSTFN0_INT_MSK)); writel(0xffffffffU, (rb + HOSTFN0_INT_MSK));
...@@ -305,24 +305,24 @@ bfa_ioc_cb_pll_init(void __iomem *rb, bfa_boolean_t fcmode) ...@@ -305,24 +305,24 @@ bfa_ioc_cb_pll_init(void __iomem *rb, bfa_boolean_t fcmode)
writel(0xffffffffU, (rb + HOSTFN1_INT_STATUS)); writel(0xffffffffU, (rb + HOSTFN1_INT_STATUS));
writel(0xffffffffU, (rb + HOSTFN0_INT_MSK)); writel(0xffffffffU, (rb + HOSTFN0_INT_MSK));
writel(0xffffffffU, (rb + HOSTFN1_INT_MSK)); writel(0xffffffffU, (rb + HOSTFN1_INT_MSK));
writel(__APP_PLL_212_LOGIC_SOFT_RESET, rb + APP_PLL_212_CTL_REG); writel(__APP_PLL_SCLK_LOGIC_SOFT_RESET, rb + APP_PLL_SCLK_CTL_REG);
writel(__APP_PLL_212_BYPASS | __APP_PLL_212_LOGIC_SOFT_RESET, writel(__APP_PLL_SCLK_BYPASS | __APP_PLL_SCLK_LOGIC_SOFT_RESET,
rb + APP_PLL_212_CTL_REG); rb + APP_PLL_SCLK_CTL_REG);
writel(__APP_PLL_400_LOGIC_SOFT_RESET, rb + APP_PLL_400_CTL_REG); writel(__APP_PLL_LCLK_LOGIC_SOFT_RESET, rb + APP_PLL_LCLK_CTL_REG);
writel(__APP_PLL_400_BYPASS | __APP_PLL_400_LOGIC_SOFT_RESET, writel(__APP_PLL_LCLK_BYPASS | __APP_PLL_LCLK_LOGIC_SOFT_RESET,
rb + APP_PLL_400_CTL_REG); rb + APP_PLL_LCLK_CTL_REG);
udelay(2); udelay(2);
writel(__APP_PLL_212_LOGIC_SOFT_RESET, rb + APP_PLL_212_CTL_REG); writel(__APP_PLL_SCLK_LOGIC_SOFT_RESET, rb + APP_PLL_SCLK_CTL_REG);
writel(__APP_PLL_400_LOGIC_SOFT_RESET, rb + APP_PLL_400_CTL_REG); writel(__APP_PLL_LCLK_LOGIC_SOFT_RESET, rb + APP_PLL_LCLK_CTL_REG);
writel(pll_sclk | __APP_PLL_212_LOGIC_SOFT_RESET, writel(pll_sclk | __APP_PLL_SCLK_LOGIC_SOFT_RESET,
rb + APP_PLL_212_CTL_REG); rb + APP_PLL_SCLK_CTL_REG);
writel(pll_fclk | __APP_PLL_400_LOGIC_SOFT_RESET, writel(pll_fclk | __APP_PLL_LCLK_LOGIC_SOFT_RESET,
rb + APP_PLL_400_CTL_REG); rb + APP_PLL_LCLK_CTL_REG);
udelay(2000); udelay(2000);
writel(0xffffffffU, (rb + HOSTFN0_INT_STATUS)); writel(0xffffffffU, (rb + HOSTFN0_INT_STATUS));
writel(0xffffffffU, (rb + HOSTFN1_INT_STATUS)); writel(0xffffffffU, (rb + HOSTFN1_INT_STATUS));
writel(pll_sclk, (rb + APP_PLL_212_CTL_REG)); writel(pll_sclk, (rb + APP_PLL_SCLK_CTL_REG));
writel(pll_fclk, (rb + APP_PLL_400_CTL_REG)); writel(pll_fclk, (rb + APP_PLL_LCLK_CTL_REG));
return BFA_STATUS_OK; return BFA_STATUS_OK;
} }
This diff is collapsed.
...@@ -24,8 +24,6 @@ ...@@ -24,8 +24,6 @@
BFA_TRC_FILE(CNA, PORT); BFA_TRC_FILE(CNA, PORT);
#define bfa_ioc_portid(__ioc) ((__ioc)->port_id)
static void static void
bfa_port_stats_swap(struct bfa_port_s *port, union bfa_port_stats_u *stats) bfa_port_stats_swap(struct bfa_port_s *port, union bfa_port_stats_u *stats)
{ {
......
...@@ -58,12 +58,12 @@ int bfa_debugfs_enable = 1; ...@@ -58,12 +58,12 @@ int bfa_debugfs_enable = 1;
int msix_disable_cb = 0, msix_disable_ct = 0; int msix_disable_cb = 0, msix_disable_ct = 0;
/* Firmware releated */ /* Firmware releated */
u32 bfi_image_ct_fc_size, bfi_image_ct_cna_size, bfi_image_cb_fc_size; u32 bfi_image_cb_size, bfi_image_ct_size, bfi_image_ct2_size;
u32 *bfi_image_ct_fc, *bfi_image_ct_cna, *bfi_image_cb_fc; u32 *bfi_image_cb, *bfi_image_ct, *bfi_image_ct2;
#define BFAD_FW_FILE_CT_FC "ctfw_fc.bin" #define BFAD_FW_FILE_CB "cbfw.bin"
#define BFAD_FW_FILE_CT_CNA "ctfw_cna.bin" #define BFAD_FW_FILE_CT "ctfw.bin"
#define BFAD_FW_FILE_CB_FC "cbfw_fc.bin" #define BFAD_FW_FILE_CT2 "ct2fw.bin"
static u32 *bfad_load_fwimg(struct pci_dev *pdev); static u32 *bfad_load_fwimg(struct pci_dev *pdev);
static void bfad_free_fwimg(void); static void bfad_free_fwimg(void);
...@@ -71,18 +71,18 @@ static void bfad_read_firmware(struct pci_dev *pdev, u32 **bfi_image, ...@@ -71,18 +71,18 @@ static void bfad_read_firmware(struct pci_dev *pdev, u32 **bfi_image,
u32 *bfi_image_size, char *fw_name); u32 *bfi_image_size, char *fw_name);
static const char *msix_name_ct[] = { static const char *msix_name_ct[] = {
"ctrl",
"cpe0", "cpe1", "cpe2", "cpe3", "cpe0", "cpe1", "cpe2", "cpe3",
"rme0", "rme1", "rme2", "rme3", "rme0", "rme1", "rme2", "rme3" };
"ctrl" };
static const char *msix_name_cb[] = { static const char *msix_name_cb[] = {
"cpe0", "cpe1", "cpe2", "cpe3", "cpe0", "cpe1", "cpe2", "cpe3",
"rme0", "rme1", "rme2", "rme3", "rme0", "rme1", "rme2", "rme3",
"eemc", "elpu0", "elpu1", "epss", "mlpu" }; "eemc", "elpu0", "elpu1", "epss", "mlpu" };
MODULE_FIRMWARE(BFAD_FW_FILE_CT_FC); MODULE_FIRMWARE(BFAD_FW_FILE_CB);
MODULE_FIRMWARE(BFAD_FW_FILE_CT_CNA); MODULE_FIRMWARE(BFAD_FW_FILE_CT);
MODULE_FIRMWARE(BFAD_FW_FILE_CB_FC); MODULE_FIRMWARE(BFAD_FW_FILE_CT2);
module_param(os_name, charp, S_IRUGO | S_IWUSR); module_param(os_name, charp, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(os_name, "OS name of the hba host machine"); MODULE_PARM_DESC(os_name, "OS name of the hba host machine");
...@@ -787,6 +787,7 @@ bfad_pci_init(struct pci_dev *pdev, struct bfad_s *bfad) ...@@ -787,6 +787,7 @@ bfad_pci_init(struct pci_dev *pdev, struct bfad_s *bfad)
} }
bfad->pci_bar0_kva = pci_iomap(pdev, 0, pci_resource_len(pdev, 0)); bfad->pci_bar0_kva = pci_iomap(pdev, 0, pci_resource_len(pdev, 0));
bfad->pci_bar2_kva = pci_iomap(pdev, 2, pci_resource_len(pdev, 2));
if (bfad->pci_bar0_kva == NULL) { if (bfad->pci_bar0_kva == NULL) {
printk(KERN_ERR "Fail to map bar0\n"); printk(KERN_ERR "Fail to map bar0\n");
...@@ -868,6 +869,7 @@ void ...@@ -868,6 +869,7 @@ void
bfad_pci_uninit(struct pci_dev *pdev, struct bfad_s *bfad) bfad_pci_uninit(struct pci_dev *pdev, struct bfad_s *bfad)
{ {
pci_iounmap(pdev, bfad->pci_bar0_kva); pci_iounmap(pdev, bfad->pci_bar0_kva);
pci_iounmap(pdev, bfad->pci_bar2_kva);
pci_release_regions(pdev); pci_release_regions(pdev);
pci_disable_device(pdev); pci_disable_device(pdev);
pci_set_drvdata(pdev, NULL); pci_set_drvdata(pdev, NULL);
...@@ -1233,8 +1235,8 @@ bfad_install_msix_handler(struct bfad_s *bfad) ...@@ -1233,8 +1235,8 @@ bfad_install_msix_handler(struct bfad_s *bfad)
for (i = 0; i < bfad->nvec; i++) { for (i = 0; i < bfad->nvec; i++) {
sprintf(bfad->msix_tab[i].name, "bfa-%s-%s", sprintf(bfad->msix_tab[i].name, "bfa-%s-%s",
bfad->pci_name, bfad->pci_name,
((bfa_asic_id_ct(bfad->hal_pcidev.device_id)) ? ((bfa_asic_id_cb(bfad->hal_pcidev.device_id)) ?
msix_name_ct[i] : msix_name_cb[i])); msix_name_cb[i] : msix_name_ct[i]));
error = request_irq(bfad->msix_tab[i].msix.vector, error = request_irq(bfad->msix_tab[i].msix.vector,
(irq_handler_t) bfad_msix, 0, (irq_handler_t) bfad_msix, 0,
...@@ -1272,8 +1274,8 @@ bfad_setup_intr(struct bfad_s *bfad) ...@@ -1272,8 +1274,8 @@ bfad_setup_intr(struct bfad_s *bfad)
/* Set up the msix entry table */ /* Set up the msix entry table */
bfad_init_msix_entry(bfad, msix_entries, mask, max_bit); bfad_init_msix_entry(bfad, msix_entries, mask, max_bit);
if ((bfa_asic_id_ct(pdev->device) && !msix_disable_ct) || if ((bfa_asic_id_ctc(pdev->device) && !msix_disable_ct) ||
(!bfa_asic_id_ct(pdev->device) && !msix_disable_cb)) { (bfa_asic_id_cb(pdev->device) && !msix_disable_cb)) {
error = pci_enable_msix(bfad->pcidev, msix_entries, bfad->nvec); error = pci_enable_msix(bfad->pcidev, msix_entries, bfad->nvec);
if (error) { if (error) {
...@@ -1346,7 +1348,8 @@ bfad_pci_probe(struct pci_dev *pdev, const struct pci_device_id *pid) ...@@ -1346,7 +1348,8 @@ bfad_pci_probe(struct pci_dev *pdev, const struct pci_device_id *pid)
int error = -ENODEV, retval; int error = -ENODEV, retval;
/* For single port cards - only claim function 0 */ /* For single port cards - only claim function 0 */
if ((pdev->device == BFA_PCI_DEVICE_ID_FC_8G1P) && if ((pdev->device == BFA_PCI_DEVICE_ID_FC_8G1P ||
pdev->device == BFA_PCI_DEVICE_ID_CT2) &&
(PCI_FUNC(pdev->devfn) != 0)) (PCI_FUNC(pdev->devfn) != 0))
return -ENODEV; return -ENODEV;
...@@ -1501,6 +1504,14 @@ struct pci_device_id bfad_id_table[] = { ...@@ -1501,6 +1504,14 @@ struct pci_device_id bfad_id_table[] = {
.class = (PCI_CLASS_SERIAL_FIBER << 8), .class = (PCI_CLASS_SERIAL_FIBER << 8),
.class_mask = ~0, .class_mask = ~0,
}, },
{
.vendor = BFA_PCI_VENDOR_ID_BROCADE,
.device = BFA_PCI_DEVICE_ID_CT2,
.subvendor = PCI_ANY_ID,
.subdevice = PCI_ANY_ID,
.class = (PCI_CLASS_SERIAL_FIBER << 8),
.class_mask = ~0,
},
{0, 0}, {0, 0},
}; };
...@@ -1594,33 +1605,33 @@ bfad_read_firmware(struct pci_dev *pdev, u32 **bfi_image, ...@@ -1594,33 +1605,33 @@ bfad_read_firmware(struct pci_dev *pdev, u32 **bfi_image,
static u32 * static u32 *
bfad_load_fwimg(struct pci_dev *pdev) bfad_load_fwimg(struct pci_dev *pdev)
{ {
if (pdev->device == BFA_PCI_DEVICE_ID_CT_FC) { if (pdev->device == BFA_PCI_DEVICE_ID_CT2) {
if (bfi_image_ct_fc_size == 0) if (bfi_image_ct2_size == 0)
bfad_read_firmware(pdev, &bfi_image_ct_fc, bfad_read_firmware(pdev, &bfi_image_ct2,
&bfi_image_ct_fc_size, BFAD_FW_FILE_CT_FC); &bfi_image_ct2_size, BFAD_FW_FILE_CT2);
return bfi_image_ct_fc; return bfi_image_ct2;
} else if (pdev->device == BFA_PCI_DEVICE_ID_CT) { } else if (bfa_asic_id_ct(pdev->device)) {
if (bfi_image_ct_cna_size == 0) if (bfi_image_ct_size == 0)
bfad_read_firmware(pdev, &bfi_image_ct_cna, bfad_read_firmware(pdev, &bfi_image_ct,
&bfi_image_ct_cna_size, BFAD_FW_FILE_CT_CNA); &bfi_image_ct_size, BFAD_FW_FILE_CT);
return bfi_image_ct_cna; return bfi_image_ct;
} else { } else {
if (bfi_image_cb_fc_size == 0) if (bfi_image_cb_size == 0)
bfad_read_firmware(pdev, &bfi_image_cb_fc, bfad_read_firmware(pdev, &bfi_image_cb,
&bfi_image_cb_fc_size, BFAD_FW_FILE_CB_FC); &bfi_image_cb_size, BFAD_FW_FILE_CB);
return bfi_image_cb_fc; return bfi_image_cb;
} }
} }
static void static void
bfad_free_fwimg(void) bfad_free_fwimg(void)
{ {
if (bfi_image_ct_fc_size && bfi_image_ct_fc) if (bfi_image_ct2_size && bfi_image_ct2)
vfree(bfi_image_ct_fc); vfree(bfi_image_ct2);
if (bfi_image_ct_cna_size && bfi_image_ct_cna) if (bfi_image_ct_size && bfi_image_ct)
vfree(bfi_image_ct_cna); vfree(bfi_image_ct);
if (bfi_image_cb_fc_size && bfi_image_cb_fc) if (bfi_image_cb_size && bfi_image_cb)
vfree(bfi_image_cb_fc); vfree(bfi_image_cb);
} }
module_init(bfad_init); module_init(bfad_init);
......
...@@ -189,6 +189,7 @@ struct bfad_s { ...@@ -189,6 +189,7 @@ struct bfad_s {
struct bfa_pcidev_s hal_pcidev; struct bfa_pcidev_s hal_pcidev;
struct bfa_ioc_pci_attr_s pci_attr; struct bfa_ioc_pci_attr_s pci_attr;
void __iomem *pci_bar0_kva; void __iomem *pci_bar0_kva;
void __iomem *pci_bar2_kva;
struct completion comp; struct completion comp;
struct completion suspend; struct completion suspend;
struct completion disable_comp; struct completion disable_comp;
......
...@@ -182,7 +182,7 @@ bfad_im_info(struct Scsi_Host *shost) ...@@ -182,7 +182,7 @@ bfad_im_info(struct Scsi_Host *shost)
bfa_get_adapter_model(bfa, model); bfa_get_adapter_model(bfa, model);
memset(bfa_buf, 0, sizeof(bfa_buf)); memset(bfa_buf, 0, sizeof(bfa_buf));
if (ioc->ctdev && !ioc->fcmode) if (bfa_ioc_is_cna(ioc))
snprintf(bfa_buf, sizeof(bfa_buf), snprintf(bfa_buf, sizeof(bfa_buf),
"Brocade FCOE Adapter, " "model: %s hwpath: %s driver: %s", "Brocade FCOE Adapter, " "model: %s hwpath: %s driver: %s",
model, bfad->pci_name, BFAD_DRIVER_VERSION); model, bfad->pci_name, BFAD_DRIVER_VERSION);
......
...@@ -28,12 +28,6 @@ ...@@ -28,12 +28,6 @@
*/ */
#define BFI_FLASH_CHUNK_SZ 256 /* Flash chunk size */ #define BFI_FLASH_CHUNK_SZ 256 /* Flash chunk size */
#define BFI_FLASH_CHUNK_SZ_WORDS (BFI_FLASH_CHUNK_SZ/sizeof(u32)) #define BFI_FLASH_CHUNK_SZ_WORDS (BFI_FLASH_CHUNK_SZ/sizeof(u32))
enum {
BFI_IMAGE_CB_FC,
BFI_IMAGE_CT_FC,
BFI_IMAGE_CT_CNA,
BFI_IMAGE_MAX,
};
/* /*
* Msg header common to all msgs * Msg header common to all msgs
...@@ -193,23 +187,28 @@ enum bfi_mclass { ...@@ -193,23 +187,28 @@ enum bfi_mclass {
#define BFI_IOC_MAX_CQS_ASIC 8 #define BFI_IOC_MAX_CQS_ASIC 8
#define BFI_IOC_MSGLEN_MAX 32 /* 32 bytes */ #define BFI_IOC_MSGLEN_MAX 32 /* 32 bytes */
#define BFI_BOOT_TYPE_OFF 8
#define BFI_BOOT_LOADER_OFF 12
#define BFI_BOOT_TYPE_NORMAL 0
#define BFI_BOOT_TYPE_FLASH 1
#define BFI_BOOT_TYPE_MEMTEST 2
#define BFI_BOOT_LOADER_OS 0
#define BFI_BOOT_LOADER_BIOS 1
#define BFI_BOOT_LOADER_UEFI 2
/* /*
*---------------------------------------------------------------------- *----------------------------------------------------------------------
* IOC * IOC
*---------------------------------------------------------------------- *----------------------------------------------------------------------
*/ */
/*
* Different asic generations
*/
enum bfi_asic_gen {
BFI_ASIC_GEN_CB = 1, /* crossbow 8G FC */
BFI_ASIC_GEN_CT = 2, /* catapult 8G FC or 10G CNA */
BFI_ASIC_GEN_CT2 = 3, /* catapult-2 16G FC or 10G CNA */
};
enum bfi_asic_mode {
BFI_ASIC_MODE_FC = 1, /* FC upto 8G speed */
BFI_ASIC_MODE_FC16 = 2, /* FC upto 16G speed */
BFI_ASIC_MODE_ETH = 3, /* Ethernet ports */
BFI_ASIC_MODE_COMBO = 4, /* FC 16G and Ethernet 10G port */
};
enum bfi_ioc_h2i_msgs { enum bfi_ioc_h2i_msgs {
BFI_IOC_H2I_ENABLE_REQ = 1, BFI_IOC_H2I_ENABLE_REQ = 1,
BFI_IOC_H2I_DISABLE_REQ = 2, BFI_IOC_H2I_DISABLE_REQ = 2,
...@@ -290,14 +289,35 @@ struct bfi_ioc_getattr_reply_s { ...@@ -290,14 +289,35 @@ struct bfi_ioc_getattr_reply_s {
#define BFI_IOC_FW_SIGNATURE (0xbfadbfad) #define BFI_IOC_FW_SIGNATURE (0xbfadbfad)
#define BFI_IOC_MD5SUM_SZ 4 #define BFI_IOC_MD5SUM_SZ 4
struct bfi_ioc_image_hdr_s { struct bfi_ioc_image_hdr_s {
u32 signature; /* constant signature */ u32 signature; /* constant signature */
u32 rsvd_a; u8 asic_gen; /* asic generation */
u32 exec; /* exec vector */ u8 asic_mode;
u32 param; /* parameters */ u8 port0_mode; /* device mode for port 0 */
u8 port1_mode; /* device mode for port 1 */
u32 exec; /* exec vector */
u32 bootenv; /* fimware boot env */
u32 rsvd_b[4]; u32 rsvd_b[4];
u32 md5sum[BFI_IOC_MD5SUM_SZ]; u32 md5sum[BFI_IOC_MD5SUM_SZ];
}; };
#define BFI_FWBOOT_DEVMODE_OFF 4
#define BFI_FWBOOT_TYPE_OFF 8
#define BFI_FWBOOT_ENV_OFF 12
#define BFI_FWBOOT_DEVMODE(__asic_gen, __asic_mode, __p0_mode, __p1_mode) \
(((u32)(__asic_gen)) << 24 | \
((u32)(__asic_mode)) << 16 | \
((u32)(__p0_mode)) << 8 | \
((u32)(__p1_mode)))
#define BFI_FWBOOT_TYPE_NORMAL 0
#define BFI_FWBOOT_TYPE_MEMTEST 1
#define BFI_FWBOOT_ENV_OS 0
enum bfi_port_mode {
BFI_PORT_MODE_FC = 1,
BFI_PORT_MODE_ETH = 2,
};
/* /*
* BFI_IOC_I2H_READY_EVENT message * BFI_IOC_I2H_READY_EVENT message
*/ */
......
This diff is collapsed.
This diff is collapsed.
...@@ -68,11 +68,24 @@ struct bfi_iocfc_bootwwns { ...@@ -68,11 +68,24 @@ struct bfi_iocfc_bootwwns {
u8 rsvd[7]; u8 rsvd[7];
}; };
/**
* Queue configuration response from firmware
*/
struct bfi_iocfc_qreg_s {
u32 cpe_q_ci_off[BFI_IOC_MAX_CQS];
u32 cpe_q_pi_off[BFI_IOC_MAX_CQS];
u32 cpe_qctl_off[BFI_IOC_MAX_CQS];
u32 rme_q_ci_off[BFI_IOC_MAX_CQS];
u32 rme_q_pi_off[BFI_IOC_MAX_CQS];
u32 rme_qctl_off[BFI_IOC_MAX_CQS];
};
struct bfi_iocfc_cfgrsp_s { struct bfi_iocfc_cfgrsp_s {
struct bfa_iocfc_fwcfg_s fwcfg; struct bfa_iocfc_fwcfg_s fwcfg;
struct bfa_iocfc_intr_attr_s intr_attr; struct bfa_iocfc_intr_attr_s intr_attr;
struct bfi_iocfc_bootwwns bootwwns; struct bfi_iocfc_bootwwns bootwwns;
struct bfi_pbc_s pbc_cfg; struct bfi_pbc_s pbc_cfg;
struct bfi_iocfc_qreg_s qreg;
}; };
/* /*
...@@ -772,4 +785,27 @@ struct bfi_tskim_rsp_s { ...@@ -772,4 +785,27 @@ struct bfi_tskim_rsp_s {
#pragma pack() #pragma pack()
/*
* Crossbow PCI MSI-X vector defines
*/
enum {
BFI_MSIX_CPE_QMIN_CB = 0,
BFI_MSIX_CPE_QMAX_CB = 7,
BFI_MSIX_RME_QMIN_CB = 8,
BFI_MSIX_RME_QMAX_CB = 15,
BFI_MSIX_CB_MAX = 22,
};
/*
* Catapult FC PCI MSI-X vector defines
*/
enum {
BFI_MSIX_LPU_ERR_CT = 0,
BFI_MSIX_CPE_QMIN_CT = 1,
BFI_MSIX_CPE_QMAX_CT = 4,
BFI_MSIX_RME_QMIN_CT = 5,
BFI_MSIX_RME_QMAX_CT = 8,
BFI_MSIX_CT_MAX = 9,
};
#endif /* __BFI_MS_H__ */ #endif /* __BFI_MS_H__ */
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment