mirror of https://gitee.com/openkylin/linux.git
[SCSI] bfa: Extend BSG interface.
- Added support to collect driver/fw stats. - Added support to perform adapter/ioc enable, disable operations. Signed-off-by: Krishna Gudipati <kgudipat@brocade.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
parent
d7be54cc5c
commit
601380669b
|
@ -249,6 +249,7 @@ struct bfa_iocfc_s {
|
|||
struct bfa_cb_qe_s init_hcb_qe;
|
||||
struct bfa_cb_qe_s stop_hcb_qe;
|
||||
struct bfa_cb_qe_s dis_hcb_qe;
|
||||
struct bfa_cb_qe_s en_hcb_qe;
|
||||
struct bfa_cb_qe_s stats_hcb_qe;
|
||||
bfa_boolean_t cfgdone;
|
||||
|
||||
|
|
|
@ -125,6 +125,7 @@ enum {
|
|||
BFA_IOCFC_ACT_INIT = 1,
|
||||
BFA_IOCFC_ACT_STOP = 2,
|
||||
BFA_IOCFC_ACT_DISABLE = 3,
|
||||
BFA_IOCFC_ACT_ENABLE = 4,
|
||||
};
|
||||
|
||||
#define DEF_CFG_NUM_FABRICS 1
|
||||
|
@ -677,6 +678,16 @@ bfa_iocfc_stop_cb(void *bfa_arg, bfa_boolean_t compl)
|
|||
bfa->iocfc.action = BFA_IOCFC_ACT_NONE;
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_iocfc_enable_cb(void *bfa_arg, bfa_boolean_t compl)
|
||||
{
|
||||
struct bfa_s *bfa = bfa_arg;
|
||||
struct bfad_s *bfad = bfa->bfad;
|
||||
|
||||
if (compl)
|
||||
complete(&bfad->enable_comp);
|
||||
}
|
||||
|
||||
static void
|
||||
bfa_iocfc_disable_cb(void *bfa_arg, bfa_boolean_t compl)
|
||||
{
|
||||
|
@ -760,8 +771,12 @@ bfa_iocfc_cfgrsp(struct bfa_s *bfa)
|
|||
|
||||
if (iocfc->action == BFA_IOCFC_ACT_INIT)
|
||||
bfa_cb_queue(bfa, &iocfc->init_hcb_qe, bfa_iocfc_init_cb, bfa);
|
||||
else
|
||||
else {
|
||||
if (bfa->iocfc.action == BFA_IOCFC_ACT_ENABLE)
|
||||
bfa_cb_queue(bfa, &bfa->iocfc.en_hcb_qe,
|
||||
bfa_iocfc_enable_cb, bfa);
|
||||
bfa_iocfc_start_submod(bfa);
|
||||
}
|
||||
}
|
||||
void
|
||||
bfa_iocfc_reset_queues(struct bfa_s *bfa)
|
||||
|
@ -970,6 +985,9 @@ bfa_iocfc_enable_cbfn(void *bfa_arg, enum bfa_status status)
|
|||
if (bfa->iocfc.action == BFA_IOCFC_ACT_INIT)
|
||||
bfa_cb_queue(bfa, &bfa->iocfc.init_hcb_qe,
|
||||
bfa_iocfc_init_cb, bfa);
|
||||
else if (bfa->iocfc.action == BFA_IOCFC_ACT_ENABLE)
|
||||
bfa_cb_queue(bfa, &bfa->iocfc.en_hcb_qe,
|
||||
bfa_iocfc_enable_cb, bfa);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1236,6 +1254,7 @@ bfa_iocfc_enable(struct bfa_s *bfa)
|
|||
{
|
||||
bfa_plog_str(bfa->plog, BFA_PL_MID_HAL, BFA_PL_EID_MISC, 0,
|
||||
"IOC Enable");
|
||||
bfa->iocfc.action = BFA_IOCFC_ACT_ENABLE;
|
||||
bfa_ioc_enable(&bfa->ioc);
|
||||
}
|
||||
|
||||
|
|
|
@ -93,9 +93,11 @@ struct bfa_lport_cfg_s {
|
|||
wwn_t pwwn; /* port wwn */
|
||||
wwn_t nwwn; /* node wwn */
|
||||
struct bfa_lport_symname_s sym_name; /* vm port symbolic name */
|
||||
bfa_boolean_t preboot_vp; /* vport created from PBC */
|
||||
enum bfa_lport_role roles; /* FCS port roles */
|
||||
u8 tag[16]; /* opaque tag from application */
|
||||
enum bfa_lport_role roles; /* FCS port roles */
|
||||
u32 rsvd;
|
||||
bfa_boolean_t preboot_vp; /* vport created from PBC */
|
||||
u8 tag[16]; /* opaque tag from application */
|
||||
u8 padding[4];
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -65,8 +65,12 @@ struct bfa_iocfc_drvcfg_s {
|
|||
u16 ioc_recover; /* IOC recovery mode */
|
||||
u16 min_cfg; /* minimum configuration */
|
||||
u16 path_tov; /* device path timeout */
|
||||
u16 num_tio_reqs; /*!< number of TM IO reqs */
|
||||
u8 port_mode;
|
||||
u8 rsvd_a;
|
||||
bfa_boolean_t delay_comp; /* delay completion of
|
||||
failed inflight IOs */
|
||||
u16 num_ttsk_reqs; /* TM task management requests */
|
||||
u32 rsvd;
|
||||
};
|
||||
|
||||
|
@ -81,7 +85,7 @@ struct bfa_iocfc_cfg_s {
|
|||
/*
|
||||
* IOC firmware IO stats
|
||||
*/
|
||||
struct bfa_fw_io_stats_s {
|
||||
struct bfa_fw_ioim_stats_s {
|
||||
u32 host_abort; /* IO aborted by host driver*/
|
||||
u32 host_cleanup; /* IO clean up by host driver */
|
||||
|
||||
|
@ -151,6 +155,54 @@ struct bfa_fw_io_stats_s {
|
|||
*/
|
||||
};
|
||||
|
||||
struct bfa_fw_tio_stats_s {
|
||||
u32 tio_conf_proc; /* TIO CONF processed */
|
||||
u32 tio_conf_drop; /* TIO CONF dropped */
|
||||
u32 tio_cleanup_req; /* TIO cleanup requested */
|
||||
u32 tio_cleanup_comp; /* TIO cleanup completed */
|
||||
u32 tio_abort_rsp; /* TIO abort response */
|
||||
u32 tio_abort_rsp_comp; /* TIO abort rsp completed */
|
||||
u32 tio_abts_req; /* TIO ABTS requested */
|
||||
u32 tio_abts_ack; /* TIO ABTS ack-ed */
|
||||
u32 tio_abts_ack_nocomp; /* TIO ABTS ack-ed but not completed */
|
||||
u32 tio_abts_tmo; /* TIO ABTS timeout */
|
||||
u32 tio_snsdata_dma; /* TIO sense data DMA */
|
||||
u32 tio_rxwchan_wait; /* TIO waiting for RX wait channel */
|
||||
u32 tio_rxwchan_avail; /* TIO RX wait channel available */
|
||||
u32 tio_hit_bls; /* TIO IOH BLS event */
|
||||
u32 tio_uf_recv; /* TIO received UF */
|
||||
u32 tio_rd_invalid_sm; /* TIO read reqst in wrong state machine */
|
||||
u32 tio_wr_invalid_sm;/* TIO write reqst in wrong state machine */
|
||||
|
||||
u32 ds_rxwchan_wait; /* DS waiting for RX wait channel */
|
||||
u32 ds_rxwchan_avail; /* DS RX wait channel available */
|
||||
u32 ds_unaligned_rd; /* DS unaligned read */
|
||||
u32 ds_rdcomp_invalid_sm; /* DS read completed in wrong state machine */
|
||||
u32 ds_wrcomp_invalid_sm; /* DS write completed in wrong state machine */
|
||||
u32 ds_flush_req; /* DS flush requested */
|
||||
u32 ds_flush_comp; /* DS flush completed */
|
||||
u32 ds_xfrdy_exp; /* DS XFER_RDY expired */
|
||||
u32 ds_seq_cnt_err; /* DS seq cnt error */
|
||||
u32 ds_seq_len_err; /* DS seq len error */
|
||||
u32 ds_data_oor; /* DS data out of order */
|
||||
u32 ds_hit_bls; /* DS hit BLS */
|
||||
u32 ds_edtov_timer_exp; /* DS edtov expired */
|
||||
u32 ds_cpu_owned; /* DS cpu owned */
|
||||
u32 ds_hit_class2; /* DS hit class2 */
|
||||
u32 ds_length_err; /* DS length error */
|
||||
u32 ds_ro_ooo_err; /* DS relative offset out-of-order error */
|
||||
u32 ds_rectov_timer_exp; /* DS rectov expired */
|
||||
u32 ds_unexp_fr_err; /* DS unexp frame error */
|
||||
};
|
||||
|
||||
/*
|
||||
* IOC firmware IO stats
|
||||
*/
|
||||
struct bfa_fw_io_stats_s {
|
||||
struct bfa_fw_ioim_stats_s ioim_stats;
|
||||
struct bfa_fw_tio_stats_s tio_stats;
|
||||
};
|
||||
|
||||
/*
|
||||
* IOC port firmware stats
|
||||
*/
|
||||
|
@ -204,6 +256,7 @@ struct bfa_fw_port_lksm_stats_s {
|
|||
u32 nos_tx; /* No. of times NOS tx started */
|
||||
u32 hwsm_lrr_rx; /* No. of times LRR rx-ed by HWSM */
|
||||
u32 hwsm_lr_rx; /* No. of times LR rx-ed by HWSM */
|
||||
u32 bbsc_lr; /* LKSM LR tx for credit recovery */
|
||||
};
|
||||
|
||||
struct bfa_fw_port_snsm_stats_s {
|
||||
|
|
|
@ -365,6 +365,78 @@ bfa_fcpim_path_tov_get(struct bfa_s *bfa)
|
|||
return fcpim->path_tov / 1000;
|
||||
}
|
||||
|
||||
#define bfa_fcpim_add_iostats(__l, __r, __stats) \
|
||||
(__l->__stats += __r->__stats)
|
||||
|
||||
void
|
||||
bfa_fcpim_add_stats(struct bfa_itnim_iostats_s *lstats,
|
||||
struct bfa_itnim_iostats_s *rstats)
|
||||
{
|
||||
bfa_fcpim_add_iostats(lstats, rstats, total_ios);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, qresumes);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, no_iotags);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, io_aborts);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, no_tskims);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, iocomp_ok);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, iocomp_underrun);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, iocomp_overrun);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, iocomp_aborted);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, iocomp_timedout);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, iocom_nexus_abort);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, iocom_proto_err);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, iocom_dif_err);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, iocom_sqer_needed);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, iocom_res_free);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, iocom_hostabrts);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, iocom_utags);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, io_cleanups);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, io_tmaborts);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, onlines);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, offlines);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, creates);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, deletes);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, create_comps);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, delete_comps);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, sler_events);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, fw_create);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, fw_delete);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, ioc_disabled);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, cleanup_comps);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, tm_cmnds);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, tm_fw_rsps);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, tm_success);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, tm_failures);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, tm_io_comps);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, tm_qresumes);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, tm_iocdowns);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, tm_cleanups);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, tm_cleanup_comps);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, io_comps);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, input_reqs);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, output_reqs);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, rd_throughput);
|
||||
bfa_fcpim_add_iostats(lstats, rstats, wr_throughput);
|
||||
}
|
||||
|
||||
bfa_status_t
|
||||
bfa_fcpim_port_iostats(struct bfa_s *bfa,
|
||||
struct bfa_itnim_iostats_s *stats, u8 lp_tag)
|
||||
{
|
||||
struct bfa_fcpim_s *fcpim = BFA_FCPIM(bfa);
|
||||
struct list_head *qe, *qen;
|
||||
struct bfa_itnim_s *itnim;
|
||||
|
||||
/* accumulate IO stats from itnim */
|
||||
memset(stats, 0, sizeof(struct bfa_itnim_iostats_s));
|
||||
list_for_each_safe(qe, qen, &fcpim->itnim_q) {
|
||||
itnim = (struct bfa_itnim_s *) qe;
|
||||
if (itnim->rport->rport_info.lp_tag != lp_tag)
|
||||
continue;
|
||||
bfa_fcpim_add_stats(stats, &(itnim->stats));
|
||||
}
|
||||
return BFA_STATUS_OK;
|
||||
}
|
||||
|
||||
u16
|
||||
bfa_fcpim_qdepth_get(struct bfa_s *bfa)
|
||||
{
|
||||
|
|
|
@ -293,6 +293,10 @@ bfa_boolean_t bfa_itnim_hold_io(struct bfa_itnim_s *itnim);
|
|||
void bfa_fcpim_path_tov_set(struct bfa_s *bfa, u16 path_tov);
|
||||
u16 bfa_fcpim_path_tov_get(struct bfa_s *bfa);
|
||||
u16 bfa_fcpim_qdepth_get(struct bfa_s *bfa);
|
||||
bfa_status_t bfa_fcpim_port_iostats(struct bfa_s *bfa,
|
||||
struct bfa_itnim_iostats_s *stats, u8 lp_tag);
|
||||
void bfa_fcpim_add_stats(struct bfa_itnim_iostats_s *fcpim_stats,
|
||||
struct bfa_itnim_iostats_s *itnim_stats);
|
||||
|
||||
#define bfa_fcpim_ioredirect_enabled(__bfa) \
|
||||
(((struct bfa_fcpim_s *)(BFA_FCPIM(__bfa)))->ioredirect)
|
||||
|
|
|
@ -452,6 +452,8 @@ bfa_fcs_rport_get_halrport(struct bfa_fcs_rport_s *rport)
|
|||
/*
|
||||
* bfa fcs rport API functions
|
||||
*/
|
||||
void bfa_fcs_rport_get_attr(struct bfa_fcs_rport_s *rport,
|
||||
struct bfa_rport_attr_s *attr);
|
||||
struct bfa_fcs_rport_s *bfa_fcs_rport_lookup(struct bfa_fcs_lport_s *port,
|
||||
wwn_t rpwwn);
|
||||
struct bfa_fcs_rport_s *bfa_fcs_rport_lookup_by_nwwn(
|
||||
|
|
|
@ -2536,7 +2536,45 @@ bfa_fcs_rport_prlo(struct bfa_fcs_rport_s *rport, __be16 ox_id)
|
|||
bfa_sm_send_event(rport, RPSM_EVENT_PRLO_RCVD);
|
||||
}
|
||||
|
||||
void
|
||||
bfa_fcs_rport_get_attr(struct bfa_fcs_rport_s *rport,
|
||||
struct bfa_rport_attr_s *rport_attr)
|
||||
{
|
||||
struct bfa_rport_qos_attr_s qos_attr;
|
||||
struct bfa_fcs_lport_s *port = rport->port;
|
||||
bfa_port_speed_t rport_speed = rport->rpf.rpsc_speed;
|
||||
|
||||
memset(rport_attr, 0, sizeof(struct bfa_rport_attr_s));
|
||||
memset(&qos_attr, 0, sizeof(struct bfa_rport_qos_attr_s));
|
||||
|
||||
rport_attr->pid = rport->pid;
|
||||
rport_attr->pwwn = rport->pwwn;
|
||||
rport_attr->nwwn = rport->nwwn;
|
||||
rport_attr->cos_supported = rport->fc_cos;
|
||||
rport_attr->df_sz = rport->maxfrsize;
|
||||
rport_attr->state = bfa_fcs_rport_get_state(rport);
|
||||
rport_attr->fc_cos = rport->fc_cos;
|
||||
rport_attr->cisc = rport->cisc;
|
||||
rport_attr->scsi_function = rport->scsi_function;
|
||||
rport_attr->curr_speed = rport->rpf.rpsc_speed;
|
||||
rport_attr->assigned_speed = rport->rpf.assigned_speed;
|
||||
|
||||
qos_attr.qos_priority = rport->bfa_rport->qos_attr.qos_priority;
|
||||
qos_attr.qos_flow_id =
|
||||
cpu_to_be32(rport->bfa_rport->qos_attr.qos_flow_id);
|
||||
rport_attr->qos_attr = qos_attr;
|
||||
|
||||
rport_attr->trl_enforced = BFA_FALSE;
|
||||
if (bfa_fcport_is_ratelim(port->fcs->bfa) &&
|
||||
(rport->scsi_function == BFA_RPORT_TARGET)) {
|
||||
if (rport_speed == BFA_PORT_SPEED_UNKNOWN)
|
||||
rport_speed =
|
||||
bfa_fcport_get_ratelim_speed(rport->fcs->bfa);
|
||||
|
||||
if (rport_speed < bfa_fcs_lport_get_rport_max_speed(port))
|
||||
rport_attr->trl_enforced = BFA_TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Remote port implementation.
|
||||
|
|
|
@ -46,6 +46,55 @@ bfad_im_bsg_put_kobject(struct fc_bsg_job *job)
|
|||
spin_unlock_irqrestore(shost->host_lock, flags);
|
||||
}
|
||||
|
||||
int
|
||||
bfad_iocmd_ioc_enable(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
|
||||
int rc = 0;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&bfad->bfad_lock, flags);
|
||||
/* If IOC is not in disabled state - return */
|
||||
if (!bfa_ioc_is_disabled(&bfad->bfa.ioc)) {
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
iocmd->status = BFA_STATUS_IOC_FAILURE;
|
||||
return rc;
|
||||
}
|
||||
|
||||
init_completion(&bfad->enable_comp);
|
||||
bfa_iocfc_enable(&bfad->bfa);
|
||||
iocmd->status = BFA_STATUS_OK;
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
wait_for_completion(&bfad->enable_comp);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
int
|
||||
bfad_iocmd_ioc_disable(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
|
||||
int rc = 0;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&bfad->bfad_lock, flags);
|
||||
if (bfad->disable_active) {
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
return EBUSY;
|
||||
}
|
||||
|
||||
bfad->disable_active = BFA_TRUE;
|
||||
init_completion(&bfad->disable_comp);
|
||||
bfa_iocfc_disable(&bfad->bfa);
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
|
||||
wait_for_completion(&bfad->disable_comp);
|
||||
bfad->disable_active = BFA_FALSE;
|
||||
iocmd->status = BFA_STATUS_OK;
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int
|
||||
bfad_iocmd_ioc_get_info(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
|
@ -112,6 +161,113 @@ bfad_iocmd_ioc_get_attr(struct bfad_s *bfad, void *cmd)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bfad_iocmd_ioc_get_stats(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_ioc_stats_s *iocmd = (struct bfa_bsg_ioc_stats_s *)cmd;
|
||||
|
||||
bfa_ioc_get_stats(&bfad->bfa, &iocmd->ioc_stats);
|
||||
iocmd->status = BFA_STATUS_OK;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bfad_iocmd_ioc_get_fwstats(struct bfad_s *bfad, void *cmd,
|
||||
unsigned int payload_len)
|
||||
{
|
||||
struct bfa_bsg_ioc_fwstats_s *iocmd =
|
||||
(struct bfa_bsg_ioc_fwstats_s *)cmd;
|
||||
void *iocmd_bufptr;
|
||||
unsigned long flags;
|
||||
|
||||
if (bfad_chk_iocmd_sz(payload_len,
|
||||
sizeof(struct bfa_bsg_ioc_fwstats_s),
|
||||
sizeof(struct bfa_fw_stats_s)) != BFA_STATUS_OK) {
|
||||
iocmd->status = BFA_STATUS_VERSION_FAIL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_ioc_fwstats_s);
|
||||
spin_lock_irqsave(&bfad->bfad_lock, flags);
|
||||
iocmd->status = bfa_ioc_fw_stats_get(&bfad->bfa.ioc, iocmd_bufptr);
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
|
||||
if (iocmd->status != BFA_STATUS_OK) {
|
||||
bfa_trc(bfad, iocmd->status);
|
||||
goto out;
|
||||
}
|
||||
out:
|
||||
bfa_trc(bfad, 0x6666);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bfad_iocmd_iocfc_get_attr(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_iocfc_attr_s *iocmd = (struct bfa_bsg_iocfc_attr_s *)cmd;
|
||||
|
||||
iocmd->status = BFA_STATUS_OK;
|
||||
bfa_iocfc_get_attr(&bfad->bfa, &iocmd->iocfc_attr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bfad_iocmd_iocfc_set_intr(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_iocfc_intr_s *iocmd = (struct bfa_bsg_iocfc_intr_s *)cmd;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&bfad->bfad_lock, flags);
|
||||
iocmd->status = bfa_iocfc_israttr_set(&bfad->bfa, &iocmd->attr);
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bfad_iocmd_port_enable(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
|
||||
struct bfad_hal_comp fcomp;
|
||||
unsigned long flags;
|
||||
|
||||
init_completion(&fcomp.comp);
|
||||
spin_lock_irqsave(&bfad->bfad_lock, flags);
|
||||
iocmd->status = bfa_port_enable(&bfad->bfa.modules.port,
|
||||
bfad_hcb_comp, &fcomp);
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
if (iocmd->status != BFA_STATUS_OK) {
|
||||
bfa_trc(bfad, iocmd->status);
|
||||
return 0;
|
||||
}
|
||||
wait_for_completion(&fcomp.comp);
|
||||
iocmd->status = fcomp.status;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bfad_iocmd_port_disable(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
|
||||
struct bfad_hal_comp fcomp;
|
||||
unsigned long flags;
|
||||
|
||||
init_completion(&fcomp.comp);
|
||||
spin_lock_irqsave(&bfad->bfad_lock, flags);
|
||||
iocmd->status = bfa_port_disable(&bfad->bfa.modules.port,
|
||||
bfad_hcb_comp, &fcomp);
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
|
||||
if (iocmd->status != BFA_STATUS_OK) {
|
||||
bfa_trc(bfad, iocmd->status);
|
||||
return 0;
|
||||
}
|
||||
wait_for_completion(&fcomp.comp);
|
||||
iocmd->status = fcomp.status;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
bfad_iocmd_port_get_attr(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
|
@ -140,6 +296,40 @@ bfad_iocmd_port_get_attr(struct bfad_s *bfad, void *cmd)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bfad_iocmd_port_get_stats(struct bfad_s *bfad, void *cmd,
|
||||
unsigned int payload_len)
|
||||
{
|
||||
struct bfa_bsg_port_stats_s *iocmd = (struct bfa_bsg_port_stats_s *)cmd;
|
||||
struct bfad_hal_comp fcomp;
|
||||
void *iocmd_bufptr;
|
||||
unsigned long flags;
|
||||
|
||||
if (bfad_chk_iocmd_sz(payload_len,
|
||||
sizeof(struct bfa_bsg_port_stats_s),
|
||||
sizeof(union bfa_port_stats_u)) != BFA_STATUS_OK) {
|
||||
iocmd->status = BFA_STATUS_VERSION_FAIL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
iocmd_bufptr = (char *)iocmd + sizeof(struct bfa_bsg_port_stats_s);
|
||||
|
||||
init_completion(&fcomp.comp);
|
||||
spin_lock_irqsave(&bfad->bfad_lock, flags);
|
||||
iocmd->status = bfa_port_get_stats(&bfad->bfa.modules.port,
|
||||
iocmd_bufptr, bfad_hcb_comp, &fcomp);
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
if (iocmd->status != BFA_STATUS_OK) {
|
||||
bfa_trc(bfad, iocmd->status);
|
||||
goto out;
|
||||
}
|
||||
|
||||
wait_for_completion(&fcomp.comp);
|
||||
iocmd->status = fcomp.status;
|
||||
out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
bfad_iocmd_lport_get_attr(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
|
@ -163,6 +353,128 @@ bfad_iocmd_lport_get_attr(struct bfad_s *bfad, void *cmd)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bfad_iocmd_lport_get_stats(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_fcs_lport_s *fcs_port;
|
||||
struct bfa_bsg_lport_stats_s *iocmd =
|
||||
(struct bfa_bsg_lport_stats_s *)cmd;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&bfad->bfad_lock, flags);
|
||||
fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
|
||||
iocmd->vf_id, iocmd->pwwn);
|
||||
if (fcs_port == NULL) {
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
|
||||
goto out;
|
||||
}
|
||||
|
||||
bfa_fcs_lport_get_stats(fcs_port, &iocmd->port_stats);
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
iocmd->status = BFA_STATUS_OK;
|
||||
out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bfad_iocmd_lport_get_iostats(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_fcs_lport_s *fcs_port;
|
||||
struct bfa_bsg_lport_iostats_s *iocmd =
|
||||
(struct bfa_bsg_lport_iostats_s *)cmd;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&bfad->bfad_lock, flags);
|
||||
fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
|
||||
iocmd->vf_id, iocmd->pwwn);
|
||||
if (fcs_port == NULL) {
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
|
||||
goto out;
|
||||
}
|
||||
|
||||
bfa_fcpim_port_iostats(&bfad->bfa, &iocmd->iostats,
|
||||
fcs_port->lp_tag);
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
iocmd->status = BFA_STATUS_OK;
|
||||
out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bfad_iocmd_lport_get_rports(struct bfad_s *bfad, void *cmd,
|
||||
unsigned int payload_len)
|
||||
{
|
||||
struct bfa_bsg_lport_get_rports_s *iocmd =
|
||||
(struct bfa_bsg_lport_get_rports_s *)cmd;
|
||||
struct bfa_fcs_lport_s *fcs_port;
|
||||
unsigned long flags;
|
||||
void *iocmd_bufptr;
|
||||
|
||||
if (iocmd->nrports == 0)
|
||||
return EINVAL;
|
||||
|
||||
if (bfad_chk_iocmd_sz(payload_len,
|
||||
sizeof(struct bfa_bsg_lport_get_rports_s),
|
||||
sizeof(wwn_t) * iocmd->nrports) != BFA_STATUS_OK) {
|
||||
iocmd->status = BFA_STATUS_VERSION_FAIL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
iocmd_bufptr = (char *)iocmd +
|
||||
sizeof(struct bfa_bsg_lport_get_rports_s);
|
||||
spin_lock_irqsave(&bfad->bfad_lock, flags);
|
||||
fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
|
||||
iocmd->vf_id, iocmd->pwwn);
|
||||
if (fcs_port == NULL) {
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
bfa_trc(bfad, 0);
|
||||
iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
|
||||
goto out;
|
||||
}
|
||||
|
||||
bfa_fcs_lport_get_rports(fcs_port, (wwn_t *)iocmd_bufptr,
|
||||
&iocmd->nrports);
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
iocmd->status = BFA_STATUS_OK;
|
||||
out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bfad_iocmd_rport_get_attr(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_rport_attr_s *iocmd = (struct bfa_bsg_rport_attr_s *)cmd;
|
||||
struct bfa_fcs_lport_s *fcs_port;
|
||||
struct bfa_fcs_rport_s *fcs_rport;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&bfad->bfad_lock, flags);
|
||||
fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
|
||||
iocmd->vf_id, iocmd->pwwn);
|
||||
if (fcs_port == NULL) {
|
||||
bfa_trc(bfad, 0);
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
|
||||
goto out;
|
||||
}
|
||||
|
||||
fcs_rport = bfa_fcs_rport_lookup(fcs_port, iocmd->rpwwn);
|
||||
if (fcs_rport == NULL) {
|
||||
bfa_trc(bfad, 0);
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
|
||||
goto out;
|
||||
}
|
||||
|
||||
bfa_fcs_rport_get_attr(fcs_rport, &iocmd->attr);
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
iocmd->status = BFA_STATUS_OK;
|
||||
out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
bfad_iocmd_rport_get_addr(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
|
@ -212,6 +524,45 @@ bfad_iocmd_rport_get_addr(struct bfad_s *bfad, void *cmd)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bfad_iocmd_rport_get_stats(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_rport_stats_s *iocmd =
|
||||
(struct bfa_bsg_rport_stats_s *)cmd;
|
||||
struct bfa_fcs_lport_s *fcs_port;
|
||||
struct bfa_fcs_rport_s *fcs_rport;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&bfad->bfad_lock, flags);
|
||||
fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
|
||||
iocmd->vf_id, iocmd->pwwn);
|
||||
if (fcs_port == NULL) {
|
||||
bfa_trc(bfad, 0);
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
|
||||
goto out;
|
||||
}
|
||||
|
||||
fcs_rport = bfa_fcs_rport_lookup(fcs_port, iocmd->rpwwn);
|
||||
if (fcs_rport == NULL) {
|
||||
bfa_trc(bfad, 0);
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
|
||||
goto out;
|
||||
}
|
||||
|
||||
memcpy((void *)&iocmd->stats, (void *)&fcs_rport->stats,
|
||||
sizeof(struct bfa_rport_stats_s));
|
||||
memcpy((void *)&iocmd->stats.hal_stats,
|
||||
(void *)&(bfa_fcs_rport_get_halrport(fcs_rport)->stats),
|
||||
sizeof(struct bfa_rport_hal_stats_s));
|
||||
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
iocmd->status = BFA_STATUS_OK;
|
||||
out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
bfad_iocmd_fabric_get_lports(struct bfad_s *bfad, void *cmd,
|
||||
unsigned int payload_len)
|
||||
|
@ -254,6 +605,45 @@ bfad_iocmd_fabric_get_lports(struct bfad_s *bfad, void *cmd,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bfad_iocmd_fcpim_get_modstats(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_fcpim_modstats_s *iocmd =
|
||||
(struct bfa_bsg_fcpim_modstats_s *)cmd;
|
||||
struct bfa_fcpim_s *fcpim = BFA_FCPIM(&bfad->bfa);
|
||||
struct list_head *qe, *qen;
|
||||
struct bfa_itnim_s *itnim;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&bfad->bfad_lock, flags);
|
||||
/* accumulate IO stats from itnim */
|
||||
memset((void *)&iocmd->modstats, 0, sizeof(struct bfa_itnim_iostats_s));
|
||||
list_for_each_safe(qe, qen, &fcpim->itnim_q) {
|
||||
itnim = (struct bfa_itnim_s *) qe;
|
||||
bfa_fcpim_add_stats(&iocmd->modstats, &(itnim->stats));
|
||||
}
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
iocmd->status = BFA_STATUS_OK;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bfad_iocmd_fcpim_get_del_itn_stats(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_fcpim_del_itn_stats_s *iocmd =
|
||||
(struct bfa_bsg_fcpim_del_itn_stats_s *)cmd;
|
||||
struct bfa_fcpim_s *fcpim = BFA_FCPIM(&bfad->bfa);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&bfad->bfad_lock, flags);
|
||||
memcpy((void *)&iocmd->modstats, (void *)&fcpim->del_itn_stats,
|
||||
sizeof(struct bfa_fcpim_del_itn_stats_s));
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
|
||||
iocmd->status = BFA_STATUS_OK;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
bfad_iocmd_itnim_get_attr(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
|
@ -273,6 +663,91 @@ bfad_iocmd_itnim_get_attr(struct bfad_s *bfad, void *cmd)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
bfad_iocmd_itnim_get_iostats(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_itnim_iostats_s *iocmd =
|
||||
(struct bfa_bsg_itnim_iostats_s *)cmd;
|
||||
struct bfa_fcs_lport_s *fcs_port;
|
||||
struct bfa_fcs_itnim_s *itnim;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&bfad->bfad_lock, flags);
|
||||
fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
|
||||
iocmd->vf_id, iocmd->lpwwn);
|
||||
if (!fcs_port) {
|
||||
iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
|
||||
bfa_trc(bfad, 0);
|
||||
} else {
|
||||
itnim = bfa_fcs_itnim_lookup(fcs_port, iocmd->rpwwn);
|
||||
if (itnim == NULL)
|
||||
iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
|
||||
else {
|
||||
iocmd->status = BFA_STATUS_OK;
|
||||
memcpy((void *)&iocmd->iostats, (void *)
|
||||
&(bfa_fcs_itnim_get_halitn(itnim)->stats),
|
||||
sizeof(struct bfa_itnim_iostats_s));
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
bfad_iocmd_itnim_get_itnstats(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_itnim_itnstats_s *iocmd =
|
||||
(struct bfa_bsg_itnim_itnstats_s *)cmd;
|
||||
struct bfa_fcs_lport_s *fcs_port;
|
||||
struct bfa_fcs_itnim_s *itnim;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&bfad->bfad_lock, flags);
|
||||
fcs_port = bfa_fcs_lookup_port(&bfad->bfa_fcs,
|
||||
iocmd->vf_id, iocmd->lpwwn);
|
||||
if (!fcs_port) {
|
||||
iocmd->status = BFA_STATUS_UNKNOWN_LWWN;
|
||||
bfa_trc(bfad, 0);
|
||||
} else {
|
||||
itnim = bfa_fcs_itnim_lookup(fcs_port, iocmd->rpwwn);
|
||||
if (itnim == NULL)
|
||||
iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
|
||||
else {
|
||||
iocmd->status = BFA_STATUS_OK;
|
||||
bfa_fcs_itnim_stats_get(fcs_port, iocmd->rpwwn,
|
||||
&iocmd->itnstats);
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bfad_iocmd_fcport_enable(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&bfad->bfad_lock, flags);
|
||||
iocmd->status = bfa_fcport_enable(&bfad->bfa);
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bfad_iocmd_fcport_disable(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&bfad->bfad_lock, flags);
|
||||
iocmd->status = bfa_fcport_disable(&bfad->bfa);
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
bfad_iocmd_ioc_get_pcifn_cfg(struct bfad_s *bfad, void *cmd)
|
||||
{
|
||||
|
@ -511,27 +986,87 @@ bfad_iocmd_handler(struct bfad_s *bfad, unsigned int cmd, void *iocmd,
|
|||
int rc = EINVAL;
|
||||
|
||||
switch (cmd) {
|
||||
case IOCMD_IOC_ENABLE:
|
||||
rc = bfad_iocmd_ioc_enable(bfad, iocmd);
|
||||
break;
|
||||
case IOCMD_IOC_DISABLE:
|
||||
rc = bfad_iocmd_ioc_disable(bfad, iocmd);
|
||||
break;
|
||||
case IOCMD_IOC_GET_INFO:
|
||||
rc = bfad_iocmd_ioc_get_info(bfad, iocmd);
|
||||
break;
|
||||
case IOCMD_IOC_GET_ATTR:
|
||||
rc = bfad_iocmd_ioc_get_attr(bfad, iocmd);
|
||||
break;
|
||||
case IOCMD_IOC_GET_STATS:
|
||||
rc = bfad_iocmd_ioc_get_stats(bfad, iocmd);
|
||||
break;
|
||||
case IOCMD_IOC_GET_FWSTATS:
|
||||
rc = bfad_iocmd_ioc_get_fwstats(bfad, iocmd, payload_len);
|
||||
break;
|
||||
case IOCMD_IOCFC_GET_ATTR:
|
||||
rc = bfad_iocmd_iocfc_get_attr(bfad, iocmd);
|
||||
break;
|
||||
case IOCMD_IOCFC_SET_INTR:
|
||||
rc = bfad_iocmd_iocfc_set_intr(bfad, iocmd);
|
||||
break;
|
||||
case IOCMD_PORT_ENABLE:
|
||||
rc = bfad_iocmd_port_enable(bfad, iocmd);
|
||||
break;
|
||||
case IOCMD_PORT_DISABLE:
|
||||
rc = bfad_iocmd_port_disable(bfad, iocmd);
|
||||
break;
|
||||
case IOCMD_PORT_GET_ATTR:
|
||||
rc = bfad_iocmd_port_get_attr(bfad, iocmd);
|
||||
break;
|
||||
case IOCMD_PORT_GET_STATS:
|
||||
rc = bfad_iocmd_port_get_stats(bfad, iocmd, payload_len);
|
||||
break;
|
||||
case IOCMD_LPORT_GET_ATTR:
|
||||
rc = bfad_iocmd_lport_get_attr(bfad, iocmd);
|
||||
break;
|
||||
case IOCMD_LPORT_GET_STATS:
|
||||
rc = bfad_iocmd_lport_get_stats(bfad, iocmd);
|
||||
break;
|
||||
case IOCMD_LPORT_GET_IOSTATS:
|
||||
rc = bfad_iocmd_lport_get_iostats(bfad, iocmd);
|
||||
break;
|
||||
case IOCMD_LPORT_GET_RPORTS:
|
||||
rc = bfad_iocmd_lport_get_rports(bfad, iocmd, payload_len);
|
||||
break;
|
||||
case IOCMD_RPORT_GET_ATTR:
|
||||
rc = bfad_iocmd_rport_get_attr(bfad, iocmd);
|
||||
break;
|
||||
case IOCMD_RPORT_GET_ADDR:
|
||||
rc = bfad_iocmd_rport_get_addr(bfad, iocmd);
|
||||
break;
|
||||
case IOCMD_RPORT_GET_STATS:
|
||||
rc = bfad_iocmd_rport_get_stats(bfad, iocmd);
|
||||
break;
|
||||
case IOCMD_FABRIC_GET_LPORTS:
|
||||
rc = bfad_iocmd_fabric_get_lports(bfad, iocmd, payload_len);
|
||||
break;
|
||||
case IOCMD_FCPIM_MODSTATS:
|
||||
rc = bfad_iocmd_fcpim_get_modstats(bfad, iocmd);
|
||||
break;
|
||||
case IOCMD_FCPIM_DEL_ITN_STATS:
|
||||
rc = bfad_iocmd_fcpim_get_del_itn_stats(bfad, iocmd);
|
||||
break;
|
||||
case IOCMD_ITNIM_GET_ATTR:
|
||||
rc = bfad_iocmd_itnim_get_attr(bfad, iocmd);
|
||||
break;
|
||||
case IOCMD_ITNIM_GET_IOSTATS:
|
||||
rc = bfad_iocmd_itnim_get_iostats(bfad, iocmd);
|
||||
break;
|
||||
case IOCMD_ITNIM_GET_ITNSTATS:
|
||||
rc = bfad_iocmd_itnim_get_itnstats(bfad, iocmd);
|
||||
break;
|
||||
case IOCMD_FCPORT_ENABLE:
|
||||
rc = bfad_iocmd_fcport_enable(bfad, iocmd);
|
||||
break;
|
||||
case IOCMD_FCPORT_DISABLE:
|
||||
rc = bfad_iocmd_fcport_disable(bfad, iocmd);
|
||||
break;
|
||||
case IOCMD_IOC_PCIFN_CFG:
|
||||
rc = bfad_iocmd_ioc_get_pcifn_cfg(bfad, iocmd);
|
||||
break;
|
||||
|
|
|
@ -24,14 +24,34 @@
|
|||
* using FC_BSG_HST_VENDOR message code.
|
||||
*/
|
||||
enum {
|
||||
IOCMD_IOC_GET_ATTR = 0x1,
|
||||
IOCMD_IOC_ENABLE = 0x1,
|
||||
IOCMD_IOC_DISABLE,
|
||||
IOCMD_IOC_GET_ATTR,
|
||||
IOCMD_IOC_GET_INFO,
|
||||
IOCMD_IOC_GET_STATS,
|
||||
IOCMD_IOC_GET_FWSTATS,
|
||||
IOCMD_IOCFC_GET_ATTR,
|
||||
IOCMD_IOCFC_SET_INTR,
|
||||
IOCMD_PORT_ENABLE,
|
||||
IOCMD_PORT_DISABLE,
|
||||
IOCMD_PORT_GET_ATTR,
|
||||
IOCMD_PORT_GET_STATS,
|
||||
IOCMD_LPORT_GET_ATTR,
|
||||
IOCMD_LPORT_GET_RPORTS,
|
||||
IOCMD_LPORT_GET_STATS,
|
||||
IOCMD_LPORT_GET_IOSTATS,
|
||||
IOCMD_RPORT_GET_ATTR,
|
||||
IOCMD_RPORT_GET_ADDR,
|
||||
IOCMD_RPORT_GET_STATS,
|
||||
IOCMD_FABRIC_GET_LPORTS,
|
||||
IOCMD_FCPIM_MODSTATS,
|
||||
IOCMD_FCPIM_DEL_ITN_STATS,
|
||||
IOCMD_ITNIM_GET_ATTR,
|
||||
IOCMD_ITNIM_GET_IOSTATS,
|
||||
IOCMD_ITNIM_GET_ITNSTATS,
|
||||
IOCMD_IOC_PCIFN_CFG,
|
||||
IOCMD_FCPORT_ENABLE,
|
||||
IOCMD_FCPORT_DISABLE,
|
||||
IOCMD_PCIFN_CREATE,
|
||||
IOCMD_PCIFN_DELETE,
|
||||
IOCMD_PCIFN_BW,
|
||||
|
@ -83,6 +103,36 @@ struct bfa_bsg_ioc_attr_s {
|
|||
struct bfa_ioc_attr_s ioc_attr;
|
||||
};
|
||||
|
||||
struct bfa_bsg_ioc_stats_s {
|
||||
bfa_status_t status;
|
||||
u16 bfad_num;
|
||||
u16 rsvd;
|
||||
struct bfa_ioc_stats_s ioc_stats;
|
||||
};
|
||||
|
||||
struct bfa_bsg_ioc_fwstats_s {
|
||||
bfa_status_t status;
|
||||
u16 bfad_num;
|
||||
u16 rsvd;
|
||||
u32 buf_size;
|
||||
u32 rsvd1;
|
||||
u64 buf_ptr;
|
||||
};
|
||||
|
||||
struct bfa_bsg_iocfc_attr_s {
|
||||
bfa_status_t status;
|
||||
u16 bfad_num;
|
||||
u16 rsvd;
|
||||
struct bfa_iocfc_attr_s iocfc_attr;
|
||||
};
|
||||
|
||||
struct bfa_bsg_iocfc_intr_s {
|
||||
bfa_status_t status;
|
||||
u16 bfad_num;
|
||||
u16 rsvd;
|
||||
struct bfa_iocfc_intr_attr_s attr;
|
||||
};
|
||||
|
||||
struct bfa_bsg_port_attr_s {
|
||||
bfa_status_t status;
|
||||
u16 bfad_num;
|
||||
|
@ -90,6 +140,15 @@ struct bfa_bsg_port_attr_s {
|
|||
struct bfa_port_attr_s attr;
|
||||
};
|
||||
|
||||
struct bfa_bsg_port_stats_s {
|
||||
bfa_status_t status;
|
||||
u16 bfad_num;
|
||||
u16 rsvd;
|
||||
u32 buf_size;
|
||||
u32 rsvd1;
|
||||
u64 buf_ptr;
|
||||
};
|
||||
|
||||
struct bfa_bsg_lport_attr_s {
|
||||
bfa_status_t status;
|
||||
u16 bfad_num;
|
||||
|
@ -98,6 +157,50 @@ struct bfa_bsg_lport_attr_s {
|
|||
struct bfa_lport_attr_s port_attr;
|
||||
};
|
||||
|
||||
struct bfa_bsg_lport_stats_s {
|
||||
bfa_status_t status;
|
||||
u16 bfad_num;
|
||||
u16 vf_id;
|
||||
wwn_t pwwn;
|
||||
struct bfa_lport_stats_s port_stats;
|
||||
};
|
||||
|
||||
struct bfa_bsg_lport_iostats_s {
|
||||
bfa_status_t status;
|
||||
u16 bfad_num;
|
||||
u16 vf_id;
|
||||
wwn_t pwwn;
|
||||
struct bfa_itnim_iostats_s iostats;
|
||||
};
|
||||
|
||||
struct bfa_bsg_lport_get_rports_s {
|
||||
bfa_status_t status;
|
||||
u16 bfad_num;
|
||||
u16 vf_id;
|
||||
wwn_t pwwn;
|
||||
u64 rbuf_ptr;
|
||||
u32 nrports;
|
||||
u32 rsvd;
|
||||
};
|
||||
|
||||
struct bfa_bsg_rport_attr_s {
|
||||
bfa_status_t status;
|
||||
u16 bfad_num;
|
||||
u16 vf_id;
|
||||
wwn_t pwwn;
|
||||
wwn_t rpwwn;
|
||||
struct bfa_rport_attr_s attr;
|
||||
};
|
||||
|
||||
struct bfa_bsg_rport_stats_s {
|
||||
bfa_status_t status;
|
||||
u16 bfad_num;
|
||||
u16 vf_id;
|
||||
wwn_t pwwn;
|
||||
wwn_t rpwwn;
|
||||
struct bfa_rport_stats_s stats;
|
||||
};
|
||||
|
||||
struct bfa_bsg_rport_scsi_addr_s {
|
||||
bfa_status_t status;
|
||||
u16 bfad_num;
|
||||
|
@ -119,6 +222,18 @@ struct bfa_bsg_fabric_get_lports_s {
|
|||
u32 rsvd;
|
||||
};
|
||||
|
||||
struct bfa_bsg_fcpim_modstats_s {
|
||||
bfa_status_t status;
|
||||
u16 bfad_num;
|
||||
struct bfa_itnim_iostats_s modstats;
|
||||
};
|
||||
|
||||
struct bfa_bsg_fcpim_del_itn_stats_s {
|
||||
bfa_status_t status;
|
||||
u16 bfad_num;
|
||||
struct bfa_fcpim_del_itn_stats_s modstats;
|
||||
};
|
||||
|
||||
struct bfa_bsg_itnim_attr_s {
|
||||
bfa_status_t status;
|
||||
u16 bfad_num;
|
||||
|
@ -128,6 +243,24 @@ struct bfa_bsg_itnim_attr_s {
|
|||
struct bfa_itnim_attr_s attr;
|
||||
};
|
||||
|
||||
struct bfa_bsg_itnim_iostats_s {
|
||||
bfa_status_t status;
|
||||
u16 bfad_num;
|
||||
u16 vf_id;
|
||||
wwn_t lpwwn;
|
||||
wwn_t rpwwn;
|
||||
struct bfa_itnim_iostats_s iostats;
|
||||
};
|
||||
|
||||
struct bfa_bsg_itnim_itnstats_s {
|
||||
bfa_status_t status;
|
||||
u16 bfad_num;
|
||||
u16 vf_id;
|
||||
wwn_t lpwwn;
|
||||
wwn_t rpwwn;
|
||||
struct bfa_itnim_stats_s itnstats;
|
||||
};
|
||||
|
||||
struct bfa_bsg_pcifn_cfg_s {
|
||||
bfa_status_t status;
|
||||
u16 bfad_num;
|
||||
|
|
|
@ -194,6 +194,7 @@ struct bfad_s {
|
|||
void __iomem *pci_bar2_kva;
|
||||
struct completion comp;
|
||||
struct completion suspend;
|
||||
struct completion enable_comp;
|
||||
struct completion disable_comp;
|
||||
bfa_boolean_t disable_active;
|
||||
struct bfad_port_s pport; /* physical port of the BFAD */
|
||||
|
|
Loading…
Reference in New Issue