[SCSI] bfa: Add support to read/update the FRU data.
- Add FRU sub-module to support FRU read/write/update. - Add support to read/write from the temp FRU module. [jejb: fix checkpatch issues] Signed-off-by: Krishna Gudipati <kgudipat@brocade.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
Родитель
4a49b04448
Коммит
e6826c96ce
|
@ -165,6 +165,16 @@ bfa_com_phy_attach(struct bfa_s *bfa, bfa_boolean_t mincfg)
|
|||
bfa_phy_memclaim(phy, phy_dma->kva_curp, phy_dma->dma_curp, mincfg);
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_com_fru_attach(struct bfa_s *bfa, bfa_boolean_t mincfg)
|
||||
{
|
||||
struct bfa_fru_s *fru = BFA_FRU(bfa);
|
||||
struct bfa_mem_dma_s *fru_dma = BFA_MEM_FRU_DMA(bfa);
|
||||
|
||||
bfa_fru_attach(fru, &bfa->ioc, bfa, bfa->trcmod, mincfg);
|
||||
bfa_fru_memclaim(fru, fru_dma->kva_curp, fru_dma->dma_curp, mincfg);
|
||||
}
|
||||
|
||||
/*
|
||||
* BFA IOC FC related definitions
|
||||
*/
|
||||
|
@ -1752,6 +1762,7 @@ bfa_cfg_get_meminfo(struct bfa_iocfc_cfg_s *cfg, struct bfa_meminfo_s *meminfo,
|
|||
struct bfa_mem_dma_s *flash_dma = BFA_MEM_FLASH_DMA(bfa);
|
||||
struct bfa_mem_dma_s *diag_dma = BFA_MEM_DIAG_DMA(bfa);
|
||||
struct bfa_mem_dma_s *phy_dma = BFA_MEM_PHY_DMA(bfa);
|
||||
struct bfa_mem_dma_s *fru_dma = BFA_MEM_FRU_DMA(bfa);
|
||||
|
||||
WARN_ON((cfg == NULL) || (meminfo == NULL));
|
||||
|
||||
|
@ -1776,6 +1787,8 @@ bfa_cfg_get_meminfo(struct bfa_iocfc_cfg_s *cfg, struct bfa_meminfo_s *meminfo,
|
|||
bfa_mem_dma_setup(meminfo, diag_dma, bfa_diag_meminfo());
|
||||
bfa_mem_dma_setup(meminfo, phy_dma,
|
||||
bfa_phy_meminfo(cfg->drvcfg.min_cfg));
|
||||
bfa_mem_dma_setup(meminfo, fru_dma,
|
||||
bfa_fru_meminfo(cfg->drvcfg.min_cfg));
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1848,6 +1861,7 @@ bfa_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg,
|
|||
bfa_com_flash_attach(bfa, cfg->drvcfg.min_cfg);
|
||||
bfa_com_diag_attach(bfa);
|
||||
bfa_com_phy_attach(bfa, cfg->drvcfg.min_cfg);
|
||||
bfa_com_fru_attach(bfa, cfg->drvcfg.min_cfg);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -196,6 +196,7 @@ enum bfa_status {
|
|||
BFA_STATUS_DPORT_ENABLED = 235, /* D-port mode is already enabled */
|
||||
BFA_STATUS_DPORT_DISABLED = 236, /* D-port mode is already disabled */
|
||||
BFA_STATUS_CMD_NOTSUPP_MEZZ = 239, /* Cmd not supported for MEZZ card */
|
||||
BFA_STATUS_FRU_NOT_PRESENT = 240, /* fru module not present */
|
||||
BFA_STATUS_DPORT_ERR = 245, /* D-port mode is enabled */
|
||||
BFA_STATUS_MAX_VAL /* Unknown error code */
|
||||
};
|
||||
|
|
|
@ -5956,3 +5956,448 @@ bfa_dconf_modexit(struct bfa_s *bfa)
|
|||
struct bfa_dconf_mod_s *dconf = BFA_DCONF_MOD(bfa);
|
||||
bfa_sm_send_event(dconf, BFA_DCONF_SM_EXIT);
|
||||
}
|
||||
|
||||
/*
|
||||
* FRU specific functions
|
||||
*/
|
||||
|
||||
#define BFA_FRU_DMA_BUF_SZ 0x02000 /* 8k dma buffer */
|
||||
#define BFA_FRU_CHINOOK_MAX_SIZE 0x10000
|
||||
#define BFA_FRU_LIGHTNING_MAX_SIZE 0x200
|
||||
|
||||
static void
|
||||
bfa_fru_notify(void *cbarg, enum bfa_ioc_event_e event)
|
||||
{
|
||||
struct bfa_fru_s *fru = cbarg;
|
||||
|
||||
bfa_trc(fru, event);
|
||||
|
||||
switch (event) {
|
||||
case BFA_IOC_E_DISABLED:
|
||||
case BFA_IOC_E_FAILED:
|
||||
if (fru->op_busy) {
|
||||
fru->status = BFA_STATUS_IOC_FAILURE;
|
||||
fru->cbfn(fru->cbarg, fru->status);
|
||||
fru->op_busy = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Send fru write request.
|
||||
*
|
||||
* @param[in] cbarg - callback argument
|
||||
*/
|
||||
static void
|
||||
bfa_fru_write_send(void *cbarg, enum bfi_fru_h2i_msgs msg_type)
|
||||
{
|
||||
struct bfa_fru_s *fru = cbarg;
|
||||
struct bfi_fru_write_req_s *msg =
|
||||
(struct bfi_fru_write_req_s *) fru->mb.msg;
|
||||
u32 len;
|
||||
|
||||
msg->offset = cpu_to_be32(fru->addr_off + fru->offset);
|
||||
len = (fru->residue < BFA_FRU_DMA_BUF_SZ) ?
|
||||
fru->residue : BFA_FRU_DMA_BUF_SZ;
|
||||
msg->length = cpu_to_be32(len);
|
||||
|
||||
/*
|
||||
* indicate if it's the last msg of the whole write operation
|
||||
*/
|
||||
msg->last = (len == fru->residue) ? 1 : 0;
|
||||
|
||||
bfi_h2i_set(msg->mh, BFI_MC_FRU, msg_type, bfa_ioc_portid(fru->ioc));
|
||||
bfa_alen_set(&msg->alen, len, fru->dbuf_pa);
|
||||
|
||||
memcpy(fru->dbuf_kva, fru->ubuf + fru->offset, len);
|
||||
bfa_ioc_mbox_queue(fru->ioc, &fru->mb);
|
||||
|
||||
fru->residue -= len;
|
||||
fru->offset += len;
|
||||
}
|
||||
|
||||
/*
|
||||
* Send fru read request.
|
||||
*
|
||||
* @param[in] cbarg - callback argument
|
||||
*/
|
||||
static void
|
||||
bfa_fru_read_send(void *cbarg, enum bfi_fru_h2i_msgs msg_type)
|
||||
{
|
||||
struct bfa_fru_s *fru = cbarg;
|
||||
struct bfi_fru_read_req_s *msg =
|
||||
(struct bfi_fru_read_req_s *) fru->mb.msg;
|
||||
u32 len;
|
||||
|
||||
msg->offset = cpu_to_be32(fru->addr_off + fru->offset);
|
||||
len = (fru->residue < BFA_FRU_DMA_BUF_SZ) ?
|
||||
fru->residue : BFA_FRU_DMA_BUF_SZ;
|
||||
msg->length = cpu_to_be32(len);
|
||||
bfi_h2i_set(msg->mh, BFI_MC_FRU, msg_type, bfa_ioc_portid(fru->ioc));
|
||||
bfa_alen_set(&msg->alen, len, fru->dbuf_pa);
|
||||
bfa_ioc_mbox_queue(fru->ioc, &fru->mb);
|
||||
}
|
||||
|
||||
/*
|
||||
* Flash memory info API.
|
||||
*
|
||||
* @param[in] mincfg - minimal cfg variable
|
||||
*/
|
||||
u32
|
||||
bfa_fru_meminfo(bfa_boolean_t mincfg)
|
||||
{
|
||||
/* min driver doesn't need fru */
|
||||
if (mincfg)
|
||||
return 0;
|
||||
|
||||
return BFA_ROUNDUP(BFA_FRU_DMA_BUF_SZ, BFA_DMA_ALIGN_SZ);
|
||||
}
|
||||
|
||||
/*
|
||||
* Flash attach API.
|
||||
*
|
||||
* @param[in] fru - fru structure
|
||||
* @param[in] ioc - ioc structure
|
||||
* @param[in] dev - device structure
|
||||
* @param[in] trcmod - trace module
|
||||
* @param[in] logmod - log module
|
||||
*/
|
||||
void
|
||||
bfa_fru_attach(struct bfa_fru_s *fru, struct bfa_ioc_s *ioc, void *dev,
|
||||
struct bfa_trc_mod_s *trcmod, bfa_boolean_t mincfg)
|
||||
{
|
||||
fru->ioc = ioc;
|
||||
fru->trcmod = trcmod;
|
||||
fru->cbfn = NULL;
|
||||
fru->cbarg = NULL;
|
||||
fru->op_busy = 0;
|
||||
|
||||
bfa_ioc_mbox_regisr(fru->ioc, BFI_MC_FRU, bfa_fru_intr, fru);
|
||||
bfa_q_qe_init(&fru->ioc_notify);
|
||||
bfa_ioc_notify_init(&fru->ioc_notify, bfa_fru_notify, fru);
|
||||
list_add_tail(&fru->ioc_notify.qe, &fru->ioc->notify_q);
|
||||
|
||||
/* min driver doesn't need fru */
|
||||
if (mincfg) {
|
||||
fru->dbuf_kva = NULL;
|
||||
fru->dbuf_pa = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Claim memory for fru
|
||||
*
|
||||
* @param[in] fru - fru structure
|
||||
* @param[in] dm_kva - pointer to virtual memory address
|
||||
* @param[in] dm_pa - frusical memory address
|
||||
* @param[in] mincfg - minimal cfg variable
|
||||
*/
|
||||
void
|
||||
bfa_fru_memclaim(struct bfa_fru_s *fru, u8 *dm_kva, u64 dm_pa,
|
||||
bfa_boolean_t mincfg)
|
||||
{
|
||||
if (mincfg)
|
||||
return;
|
||||
|
||||
fru->dbuf_kva = dm_kva;
|
||||
fru->dbuf_pa = dm_pa;
|
||||
memset(fru->dbuf_kva, 0, BFA_FRU_DMA_BUF_SZ);
|
||||
dm_kva += BFA_ROUNDUP(BFA_FRU_DMA_BUF_SZ, BFA_DMA_ALIGN_SZ);
|
||||
dm_pa += BFA_ROUNDUP(BFA_FRU_DMA_BUF_SZ, BFA_DMA_ALIGN_SZ);
|
||||
}
|
||||
|
||||
/*
|
||||
* Update fru vpd image.
|
||||
*
|
||||
* @param[in] fru - fru structure
|
||||
* @param[in] buf - update data buffer
|
||||
* @param[in] len - data buffer length
|
||||
* @param[in] offset - offset relative to starting address
|
||||
* @param[in] cbfn - callback function
|
||||
* @param[in] cbarg - callback argument
|
||||
*
|
||||
* Return status.
|
||||
*/
|
||||
bfa_status_t
|
||||
bfa_fruvpd_update(struct bfa_fru_s *fru, void *buf, u32 len, u32 offset,
|
||||
bfa_cb_fru_t cbfn, void *cbarg)
|
||||
{
|
||||
bfa_trc(fru, BFI_FRUVPD_H2I_WRITE_REQ);
|
||||
bfa_trc(fru, len);
|
||||
bfa_trc(fru, offset);
|
||||
|
||||
if (fru->ioc->asic_gen != BFI_ASIC_GEN_CT2)
|
||||
return BFA_STATUS_FRU_NOT_PRESENT;
|
||||
|
||||
if (fru->ioc->attr->card_type != BFA_MFG_TYPE_CHINOOK)
|
||||
return BFA_STATUS_CMD_NOTSUPP;
|
||||
|
||||
if (!bfa_ioc_is_operational(fru->ioc))
|
||||
return BFA_STATUS_IOC_NON_OP;
|
||||
|
||||
if (fru->op_busy) {
|
||||
bfa_trc(fru, fru->op_busy);
|
||||
return BFA_STATUS_DEVBUSY;
|
||||
}
|
||||
|
||||
fru->op_busy = 1;
|
||||
|
||||
fru->cbfn = cbfn;
|
||||
fru->cbarg = cbarg;
|
||||
fru->residue = len;
|
||||
fru->offset = 0;
|
||||
fru->addr_off = offset;
|
||||
fru->ubuf = buf;
|
||||
|
||||
bfa_fru_write_send(fru, BFI_FRUVPD_H2I_WRITE_REQ);
|
||||
|
||||
return BFA_STATUS_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Read fru vpd image.
|
||||
*
|
||||
* @param[in] fru - fru structure
|
||||
* @param[in] buf - read data buffer
|
||||
* @param[in] len - data buffer length
|
||||
* @param[in] offset - offset relative to starting address
|
||||
* @param[in] cbfn - callback function
|
||||
* @param[in] cbarg - callback argument
|
||||
*
|
||||
* Return status.
|
||||
*/
|
||||
bfa_status_t
|
||||
bfa_fruvpd_read(struct bfa_fru_s *fru, void *buf, u32 len, u32 offset,
|
||||
bfa_cb_fru_t cbfn, void *cbarg)
|
||||
{
|
||||
bfa_trc(fru, BFI_FRUVPD_H2I_READ_REQ);
|
||||
bfa_trc(fru, len);
|
||||
bfa_trc(fru, offset);
|
||||
|
||||
if (fru->ioc->asic_gen != BFI_ASIC_GEN_CT2)
|
||||
return BFA_STATUS_FRU_NOT_PRESENT;
|
||||
|
||||
if (fru->ioc->attr->card_type != BFA_MFG_TYPE_CHINOOK)
|
||||
return BFA_STATUS_CMD_NOTSUPP;
|
||||
|
||||
if (!bfa_ioc_is_operational(fru->ioc))
|
||||
return BFA_STATUS_IOC_NON_OP;
|
||||
|
||||
if (fru->op_busy) {
|
||||
bfa_trc(fru, fru->op_busy);
|
||||
return BFA_STATUS_DEVBUSY;
|
||||
}
|
||||
|
||||
fru->op_busy = 1;
|
||||
|
||||
fru->cbfn = cbfn;
|
||||
fru->cbarg = cbarg;
|
||||
fru->residue = len;
|
||||
fru->offset = 0;
|
||||
fru->addr_off = offset;
|
||||
fru->ubuf = buf;
|
||||
bfa_fru_read_send(fru, BFI_FRUVPD_H2I_READ_REQ);
|
||||
|
||||
return BFA_STATUS_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get maximum size fru vpd image.
|
||||
*
|
||||
* @param[in] fru - fru structure
|
||||
* @param[out] size - maximum size of fru vpd data
|
||||
*
|
||||
* Return status.
|
||||
*/
|
||||
bfa_status_t
|
||||
bfa_fruvpd_get_max_size(struct bfa_fru_s *fru, u32 *max_size)
|
||||
{
|
||||
if (fru->ioc->asic_gen != BFI_ASIC_GEN_CT2)
|
||||
return BFA_STATUS_FRU_NOT_PRESENT;
|
||||
|
||||
if (!bfa_ioc_is_operational(fru->ioc))
|
||||
return BFA_STATUS_IOC_NON_OP;
|
||||
|
||||
if (fru->ioc->attr->card_type == BFA_MFG_TYPE_CHINOOK)
|
||||
*max_size = BFA_FRU_CHINOOK_MAX_SIZE;
|
||||
else
|
||||
return BFA_STATUS_CMD_NOTSUPP;
|
||||
return BFA_STATUS_OK;
|
||||
}
|
||||
/*
|
||||
* tfru write.
|
||||
*
|
||||
* @param[in] fru - fru structure
|
||||
* @param[in] buf - update data buffer
|
||||
* @param[in] len - data buffer length
|
||||
* @param[in] offset - offset relative to starting address
|
||||
* @param[in] cbfn - callback function
|
||||
* @param[in] cbarg - callback argument
|
||||
*
|
||||
* Return status.
|
||||
*/
|
||||
bfa_status_t
|
||||
bfa_tfru_write(struct bfa_fru_s *fru, void *buf, u32 len, u32 offset,
|
||||
bfa_cb_fru_t cbfn, void *cbarg)
|
||||
{
|
||||
bfa_trc(fru, BFI_TFRU_H2I_WRITE_REQ);
|
||||
bfa_trc(fru, len);
|
||||
bfa_trc(fru, offset);
|
||||
bfa_trc(fru, *((u8 *) buf));
|
||||
|
||||
if (fru->ioc->asic_gen != BFI_ASIC_GEN_CT2)
|
||||
return BFA_STATUS_FRU_NOT_PRESENT;
|
||||
|
||||
if (!bfa_ioc_is_operational(fru->ioc))
|
||||
return BFA_STATUS_IOC_NON_OP;
|
||||
|
||||
if (fru->op_busy) {
|
||||
bfa_trc(fru, fru->op_busy);
|
||||
return BFA_STATUS_DEVBUSY;
|
||||
}
|
||||
|
||||
fru->op_busy = 1;
|
||||
|
||||
fru->cbfn = cbfn;
|
||||
fru->cbarg = cbarg;
|
||||
fru->residue = len;
|
||||
fru->offset = 0;
|
||||
fru->addr_off = offset;
|
||||
fru->ubuf = buf;
|
||||
|
||||
bfa_fru_write_send(fru, BFI_TFRU_H2I_WRITE_REQ);
|
||||
|
||||
return BFA_STATUS_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* tfru read.
|
||||
*
|
||||
* @param[in] fru - fru structure
|
||||
* @param[in] buf - read data buffer
|
||||
* @param[in] len - data buffer length
|
||||
* @param[in] offset - offset relative to starting address
|
||||
* @param[in] cbfn - callback function
|
||||
* @param[in] cbarg - callback argument
|
||||
*
|
||||
* Return status.
|
||||
*/
|
||||
bfa_status_t
|
||||
bfa_tfru_read(struct bfa_fru_s *fru, void *buf, u32 len, u32 offset,
|
||||
bfa_cb_fru_t cbfn, void *cbarg)
|
||||
{
|
||||
bfa_trc(fru, BFI_TFRU_H2I_READ_REQ);
|
||||
bfa_trc(fru, len);
|
||||
bfa_trc(fru, offset);
|
||||
|
||||
if (fru->ioc->asic_gen != BFI_ASIC_GEN_CT2)
|
||||
return BFA_STATUS_FRU_NOT_PRESENT;
|
||||
|
||||
if (!bfa_ioc_is_operational(fru->ioc))
|
||||
return BFA_STATUS_IOC_NON_OP;
|
||||
|
||||
if (fru->op_busy) {
|
||||
bfa_trc(fru, fru->op_busy);
|
||||
return BFA_STATUS_DEVBUSY;
|
||||
}
|
||||
|
||||
fru->op_busy = 1;
|
||||
|
||||
fru->cbfn = cbfn;
|
||||
fru->cbarg = cbarg;
|
||||
fru->residue = len;
|
||||
fru->offset = 0;
|
||||
fru->addr_off = offset;
|
||||
fru->ubuf = buf;
|
||||
bfa_fru_read_send(fru, BFI_TFRU_H2I_READ_REQ);
|
||||
|
||||
return BFA_STATUS_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Process fru response messages upon receiving interrupts.
|
||||
*
|
||||
* @param[in] fruarg - fru structure
|
||||
* @param[in] msg - message structure
|
||||
*/
|
||||
void
|
||||
bfa_fru_intr(void *fruarg, struct bfi_mbmsg_s *msg)
|
||||
{
|
||||
struct bfa_fru_s *fru = fruarg;
|
||||
struct bfi_fru_rsp_s *rsp = (struct bfi_fru_rsp_s *)msg;
|
||||
u32 status;
|
||||
|
||||
bfa_trc(fru, msg->mh.msg_id);
|
||||
|
||||
if (!fru->op_busy) {
|
||||
/*
|
||||
* receiving response after ioc failure
|
||||
*/
|
||||
bfa_trc(fru, 0x9999);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (msg->mh.msg_id) {
|
||||
case BFI_FRUVPD_I2H_WRITE_RSP:
|
||||
case BFI_TFRU_I2H_WRITE_RSP:
|
||||
status = be32_to_cpu(rsp->status);
|
||||
bfa_trc(fru, status);
|
||||
|
||||
if (status != BFA_STATUS_OK || fru->residue == 0) {
|
||||
fru->status = status;
|
||||
fru->op_busy = 0;
|
||||
if (fru->cbfn)
|
||||
fru->cbfn(fru->cbarg, fru->status);
|
||||
} else {
|
||||
bfa_trc(fru, fru->offset);
|
||||
if (msg->mh.msg_id == BFI_FRUVPD_I2H_WRITE_RSP)
|
||||
bfa_fru_write_send(fru,
|
||||
BFI_FRUVPD_H2I_WRITE_REQ);
|
||||
else
|
||||
bfa_fru_write_send(fru,
|
||||
BFI_TFRU_H2I_WRITE_REQ);
|
||||
}
|
||||
break;
|
||||
case BFI_FRUVPD_I2H_READ_RSP:
|
||||
case BFI_TFRU_I2H_READ_RSP:
|
||||
status = be32_to_cpu(rsp->status);
|
||||
bfa_trc(fru, status);
|
||||
|
||||
if (status != BFA_STATUS_OK) {
|
||||
fru->status = status;
|
||||
fru->op_busy = 0;
|
||||
if (fru->cbfn)
|
||||
fru->cbfn(fru->cbarg, fru->status);
|
||||
} else {
|
||||
u32 len = be32_to_cpu(rsp->length);
|
||||
|
||||
bfa_trc(fru, fru->offset);
|
||||
bfa_trc(fru, len);
|
||||
|
||||
memcpy(fru->ubuf + fru->offset, fru->dbuf_kva, len);
|
||||
fru->residue -= len;
|
||||
fru->offset += len;
|
||||
|
||||
if (fru->residue == 0) {
|
||||
fru->status = status;
|
||||
fru->op_busy = 0;
|
||||
if (fru->cbfn)
|
||||
fru->cbfn(fru->cbarg, fru->status);
|
||||
} else {
|
||||
if (msg->mh.msg_id == BFI_FRUVPD_I2H_READ_RSP)
|
||||
bfa_fru_read_send(fru,
|
||||
BFI_FRUVPD_H2I_READ_REQ);
|
||||
else
|
||||
bfa_fru_read_send(fru,
|
||||
BFI_TFRU_H2I_READ_REQ);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
WARN_ON(1);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -701,6 +701,55 @@ void bfa_phy_memclaim(struct bfa_phy_s *phy,
|
|||
u8 *dm_kva, u64 dm_pa, bfa_boolean_t mincfg);
|
||||
void bfa_phy_intr(void *phyarg, struct bfi_mbmsg_s *msg);
|
||||
|
||||
/*
|
||||
* FRU module specific
|
||||
*/
|
||||
typedef void (*bfa_cb_fru_t) (void *cbarg, bfa_status_t status);
|
||||
|
||||
struct bfa_fru_s {
|
||||
struct bfa_ioc_s *ioc; /* back pointer to ioc */
|
||||
struct bfa_trc_mod_s *trcmod; /* trace module */
|
||||
u8 op_busy; /* operation busy flag */
|
||||
u8 rsv[3];
|
||||
u32 residue; /* residual length */
|
||||
u32 offset; /* offset */
|
||||
bfa_status_t status; /* status */
|
||||
u8 *dbuf_kva; /* dma buf virtual address */
|
||||
u64 dbuf_pa; /* dma buf physical address */
|
||||
struct bfa_reqq_wait_s reqq_wait; /* to wait for room in reqq */
|
||||
bfa_cb_fru_t cbfn; /* user callback function */
|
||||
void *cbarg; /* user callback arg */
|
||||
u8 *ubuf; /* user supplied buffer */
|
||||
struct bfa_cb_qe_s hcb_qe; /* comp: BFA callback qelem */
|
||||
u32 addr_off; /* fru address offset */
|
||||
struct bfa_mbox_cmd_s mb; /* mailbox */
|
||||
struct bfa_ioc_notify_s ioc_notify; /* ioc event notify */
|
||||
struct bfa_mem_dma_s fru_dma;
|
||||
};
|
||||
|
||||
#define BFA_FRU(__bfa) (&(__bfa)->modules.fru)
|
||||
#define BFA_MEM_FRU_DMA(__bfa) (&(BFA_FRU(__bfa)->fru_dma))
|
||||
|
||||
bfa_status_t bfa_fruvpd_update(struct bfa_fru_s *fru,
|
||||
void *buf, u32 len, u32 offset,
|
||||
bfa_cb_fru_t cbfn, void *cbarg);
|
||||
bfa_status_t bfa_fruvpd_read(struct bfa_fru_s *fru,
|
||||
void *buf, u32 len, u32 offset,
|
||||
bfa_cb_fru_t cbfn, void *cbarg);
|
||||
bfa_status_t bfa_fruvpd_get_max_size(struct bfa_fru_s *fru, u32 *max_size);
|
||||
bfa_status_t bfa_tfru_write(struct bfa_fru_s *fru,
|
||||
void *buf, u32 len, u32 offset,
|
||||
bfa_cb_fru_t cbfn, void *cbarg);
|
||||
bfa_status_t bfa_tfru_read(struct bfa_fru_s *fru,
|
||||
void *buf, u32 len, u32 offset,
|
||||
bfa_cb_fru_t cbfn, void *cbarg);
|
||||
u32 bfa_fru_meminfo(bfa_boolean_t mincfg);
|
||||
void bfa_fru_attach(struct bfa_fru_s *fru, struct bfa_ioc_s *ioc,
|
||||
void *dev, struct bfa_trc_mod_s *trcmod, bfa_boolean_t mincfg);
|
||||
void bfa_fru_memclaim(struct bfa_fru_s *fru,
|
||||
u8 *dm_kva, u64 dm_pa, bfa_boolean_t mincfg);
|
||||
void bfa_fru_intr(void *fruarg, struct bfi_mbmsg_s *msg);
|
||||
|
||||
/*
|
||||
* Driver Config( dconf) specific
|
||||
*/
|
||||
|
|
|
@ -45,6 +45,7 @@ struct bfa_modules_s {
|
|||
struct bfa_diag_s diag_mod; /* diagnostics module */
|
||||
struct bfa_phy_s phy; /* phy module */
|
||||
struct bfa_dconf_mod_s dconf_mod; /* DCONF common module */
|
||||
struct bfa_fru_s fru; /* fru module */
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -107,9 +107,10 @@ bfad_iocmd_ioc_get_info(struct bfad_s *bfad, void *cmd)
|
|||
|
||||
/* set adapter hw path */
|
||||
strcpy(iocmd->adapter_hwpath, bfad->pci_name);
|
||||
i = strlen(iocmd->adapter_hwpath) - 1;
|
||||
while (iocmd->adapter_hwpath[i] != '.')
|
||||
i--;
|
||||
for (i = 0; iocmd->adapter_hwpath[i] != ':' && i < BFA_STRING_32; i++)
|
||||
;
|
||||
for (; iocmd->adapter_hwpath[++i] != ':' && i < BFA_STRING_32; )
|
||||
;
|
||||
iocmd->adapter_hwpath[i] = '\0';
|
||||
iocmd->status = BFA_STATUS_OK;
|
||||
return 0;
|
||||
|
@ -2583,6 +2584,109 @@ bfad_iocmd_fcpim_throttle_set(struct bfad_s *bfad, void *cmd)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bfad_iocmd_tfru_read(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_tfru_s *iocmd =
|
||||
(struct bfa_bsg_tfru_s *)cmd;
|
||||
struct bfad_hal_comp fcomp;
|
||||
unsigned long flags = 0;
|
||||
|
||||
init_completion(&fcomp.comp);
|
||||
spin_lock_irqsave(&bfad->bfad_lock, flags);
|
||||
iocmd->status = bfa_tfru_read(BFA_FRU(&bfad->bfa),
|
||||
&iocmd->data, iocmd->len, iocmd->offset,
|
||||
bfad_hcb_comp, &fcomp);
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
if (iocmd->status == BFA_STATUS_OK) {
|
||||
wait_for_completion(&fcomp.comp);
|
||||
iocmd->status = fcomp.status;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bfad_iocmd_tfru_write(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_tfru_s *iocmd =
|
||||
(struct bfa_bsg_tfru_s *)cmd;
|
||||
struct bfad_hal_comp fcomp;
|
||||
unsigned long flags = 0;
|
||||
|
||||
init_completion(&fcomp.comp);
|
||||
spin_lock_irqsave(&bfad->bfad_lock, flags);
|
||||
iocmd->status = bfa_tfru_write(BFA_FRU(&bfad->bfa),
|
||||
&iocmd->data, iocmd->len, iocmd->offset,
|
||||
bfad_hcb_comp, &fcomp);
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
if (iocmd->status == BFA_STATUS_OK) {
|
||||
wait_for_completion(&fcomp.comp);
|
||||
iocmd->status = fcomp.status;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bfad_iocmd_fruvpd_read(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_fruvpd_s *iocmd =
|
||||
(struct bfa_bsg_fruvpd_s *)cmd;
|
||||
struct bfad_hal_comp fcomp;
|
||||
unsigned long flags = 0;
|
||||
|
||||
init_completion(&fcomp.comp);
|
||||
spin_lock_irqsave(&bfad->bfad_lock, flags);
|
||||
iocmd->status = bfa_fruvpd_read(BFA_FRU(&bfad->bfa),
|
||||
&iocmd->data, iocmd->len, iocmd->offset,
|
||||
bfad_hcb_comp, &fcomp);
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
if (iocmd->status == BFA_STATUS_OK) {
|
||||
wait_for_completion(&fcomp.comp);
|
||||
iocmd->status = fcomp.status;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bfad_iocmd_fruvpd_update(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_fruvpd_s *iocmd =
|
||||
(struct bfa_bsg_fruvpd_s *)cmd;
|
||||
struct bfad_hal_comp fcomp;
|
||||
unsigned long flags = 0;
|
||||
|
||||
init_completion(&fcomp.comp);
|
||||
spin_lock_irqsave(&bfad->bfad_lock, flags);
|
||||
iocmd->status = bfa_fruvpd_update(BFA_FRU(&bfad->bfa),
|
||||
&iocmd->data, iocmd->len, iocmd->offset,
|
||||
bfad_hcb_comp, &fcomp);
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
if (iocmd->status == BFA_STATUS_OK) {
|
||||
wait_for_completion(&fcomp.comp);
|
||||
iocmd->status = fcomp.status;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bfad_iocmd_fruvpd_get_max_size(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_fruvpd_max_size_s *iocmd =
|
||||
(struct bfa_bsg_fruvpd_max_size_s *)cmd;
|
||||
unsigned long flags = 0;
|
||||
|
||||
spin_lock_irqsave(&bfad->bfad_lock, flags);
|
||||
iocmd->status = bfa_fruvpd_get_max_size(BFA_FRU(&bfad->bfa),
|
||||
&iocmd->max_size);
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
bfad_iocmd_handler(struct bfad_s *bfad, unsigned int cmd, void *iocmd,
|
||||
unsigned int payload_len)
|
||||
|
@ -2923,6 +3027,23 @@ bfad_iocmd_handler(struct bfad_s *bfad, unsigned int cmd, void *iocmd,
|
|||
case IOCMD_FCPIM_THROTTLE_SET:
|
||||
rc = bfad_iocmd_fcpim_throttle_set(bfad, iocmd);
|
||||
break;
|
||||
/* TFRU */
|
||||
case IOCMD_TFRU_READ:
|
||||
rc = bfad_iocmd_tfru_read(bfad, iocmd);
|
||||
break;
|
||||
case IOCMD_TFRU_WRITE:
|
||||
rc = bfad_iocmd_tfru_write(bfad, iocmd);
|
||||
break;
|
||||
/* FRU */
|
||||
case IOCMD_FRUVPD_READ:
|
||||
rc = bfad_iocmd_fruvpd_read(bfad, iocmd);
|
||||
break;
|
||||
case IOCMD_FRUVPD_UPDATE:
|
||||
rc = bfad_iocmd_fruvpd_update(bfad, iocmd);
|
||||
break;
|
||||
case IOCMD_FRUVPD_GET_MAX_SIZE:
|
||||
rc = bfad_iocmd_fruvpd_get_max_size(bfad, iocmd);
|
||||
break;
|
||||
default:
|
||||
rc = -EINVAL;
|
||||
break;
|
||||
|
|
|
@ -146,7 +146,12 @@ enum {
|
|||
IOCMD_DIAG_DPORT_GET_STATE,
|
||||
IOCMD_QOS_SET_BW,
|
||||
IOCMD_FCPIM_THROTTLE_QUERY,
|
||||
IOCMD_FCPIM_THROTTLE_SET
|
||||
IOCMD_FCPIM_THROTTLE_SET,
|
||||
IOCMD_TFRU_READ,
|
||||
IOCMD_TFRU_WRITE,
|
||||
IOCMD_FRUVPD_READ,
|
||||
IOCMD_FRUVPD_UPDATE,
|
||||
IOCMD_FRUVPD_GET_MAX_SIZE,
|
||||
};
|
||||
|
||||
struct bfa_bsg_gen_s {
|
||||
|
@ -750,6 +755,34 @@ struct bfa_bsg_fcpim_throttle_s {
|
|||
struct bfa_defs_fcpim_throttle_s throttle;
|
||||
};
|
||||
|
||||
#define BFA_TFRU_DATA_SIZE 64
|
||||
#define BFA_MAX_FRUVPD_TRANSFER_SIZE 0x1000
|
||||
|
||||
struct bfa_bsg_tfru_s {
|
||||
bfa_status_t status;
|
||||
u16 bfad_num;
|
||||
u16 rsvd;
|
||||
u32 offset;
|
||||
u32 len;
|
||||
u8 data[BFA_TFRU_DATA_SIZE];
|
||||
};
|
||||
|
||||
struct bfa_bsg_fruvpd_s {
|
||||
bfa_status_t status;
|
||||
u16 bfad_num;
|
||||
u16 rsvd;
|
||||
u32 offset;
|
||||
u32 len;
|
||||
u8 data[BFA_MAX_FRUVPD_TRANSFER_SIZE];
|
||||
};
|
||||
|
||||
struct bfa_bsg_fruvpd_max_size_s {
|
||||
bfa_status_t status;
|
||||
u16 bfad_num;
|
||||
u16 rsvd;
|
||||
u32 max_size;
|
||||
};
|
||||
|
||||
struct bfa_bsg_fcpt_s {
|
||||
bfa_status_t status;
|
||||
u16 vf_id;
|
||||
|
|
|
@ -210,7 +210,8 @@ enum bfi_mclass {
|
|||
BFI_MC_PORT = 21, /* Physical port */
|
||||
BFI_MC_SFP = 22, /* SFP module */
|
||||
BFI_MC_PHY = 25, /* External PHY message class */
|
||||
BFI_MC_MAX = 32
|
||||
BFI_MC_FRU = 34,
|
||||
BFI_MC_MAX = 35
|
||||
};
|
||||
|
||||
#define BFI_IOC_MAX_CQS 4
|
||||
|
@ -1170,6 +1171,50 @@ struct bfi_phy_write_rsp_s {
|
|||
u32 length;
|
||||
};
|
||||
|
||||
enum bfi_fru_h2i_msgs {
|
||||
BFI_FRUVPD_H2I_WRITE_REQ = 1,
|
||||
BFI_FRUVPD_H2I_READ_REQ = 2,
|
||||
BFI_TFRU_H2I_WRITE_REQ = 3,
|
||||
BFI_TFRU_H2I_READ_REQ = 4,
|
||||
};
|
||||
|
||||
enum bfi_fru_i2h_msgs {
|
||||
BFI_FRUVPD_I2H_WRITE_RSP = BFA_I2HM(1),
|
||||
BFI_FRUVPD_I2H_READ_RSP = BFA_I2HM(2),
|
||||
BFI_TFRU_I2H_WRITE_RSP = BFA_I2HM(3),
|
||||
BFI_TFRU_I2H_READ_RSP = BFA_I2HM(4),
|
||||
};
|
||||
|
||||
/*
|
||||
* FRU write request
|
||||
*/
|
||||
struct bfi_fru_write_req_s {
|
||||
struct bfi_mhdr_s mh; /* Common msg header */
|
||||
u8 last;
|
||||
u8 rsv[3];
|
||||
u32 offset;
|
||||
u32 length;
|
||||
struct bfi_alen_s alen;
|
||||
};
|
||||
|
||||
/*
|
||||
* FRU read request
|
||||
*/
|
||||
struct bfi_fru_read_req_s {
|
||||
struct bfi_mhdr_s mh; /* Common msg header */
|
||||
u32 offset;
|
||||
u32 length;
|
||||
struct bfi_alen_s alen;
|
||||
};
|
||||
|
||||
/*
|
||||
* FRU response
|
||||
*/
|
||||
struct bfi_fru_rsp_s {
|
||||
struct bfi_mhdr_s mh; /* Common msg header */
|
||||
u32 status;
|
||||
u32 length;
|
||||
};
|
||||
#pragma pack()
|
||||
|
||||
#endif /* __BFI_H__ */
|
||||
|
|
|
@ -426,6 +426,7 @@ struct bfi_lps_login_req_s {
|
|||
u8 auth_en;
|
||||
u8 lps_role;
|
||||
u8 bb_scn;
|
||||
u32 vvl_flag;
|
||||
};
|
||||
|
||||
struct bfi_lps_login_rsp_s {
|
||||
|
|
Загрузка…
Ссылка в новой задаче