From 2f97b6452bf63f8163ad246c243cc0a2c07a9cbf Mon Sep 17 00:00:00 2001 From: Krishna Gudipati Date: Wed, 20 Jul 2011 17:02:50 -0700 Subject: [PATCH] --- yaml --- r: 261691 b: refs/heads/master c: 45191236b179877d259a40e13c5144628d4df37f h: refs/heads/master i: 261689: 481e3f7532bc7c0c1e6173e4c51ec959c8a966c3 261687: 765adf65b33874ddb5c21856b561b618083bc4a6 v: v3 --- [refs] | 2 +- trunk/drivers/scsi/bfa/bfad_bsg.c | 54 +++++++++++++++++++++++++++++++ trunk/drivers/scsi/bfa/bfad_bsg.h | 10 ++++++ 3 files changed, 65 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index fb4beee2aa15..a26b54ab37ad 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a46bd300e191d5a1a7367a799a9f5268c5e6aafd +refs/heads/master: 45191236b179877d259a40e13c5144628d4df37f diff --git a/trunk/drivers/scsi/bfa/bfad_bsg.c b/trunk/drivers/scsi/bfa/bfad_bsg.c index f782ee4b8868..55a9180b0a39 100644 --- a/trunk/drivers/scsi/bfa/bfad_bsg.c +++ b/trunk/drivers/scsi/bfa/bfad_bsg.c @@ -2181,6 +2181,53 @@ bfad_iocmd_ethboot_query(struct bfad_s *bfad, void *cmd) return 0; } +int +bfad_iocmd_cfg_trunk(struct bfad_s *bfad, void *cmd, unsigned int v_cmd) +{ + struct bfa_bsg_gen_s *iocmd = (struct bfa_bsg_gen_s *)cmd; + struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa); + struct bfa_fcport_trunk_s *trunk = &fcport->trunk; + unsigned long flags; + + spin_lock_irqsave(&bfad->bfad_lock, flags); + + if (v_cmd == IOCMD_TRUNK_ENABLE) { + trunk->attr.state = BFA_TRUNK_OFFLINE; + bfa_fcport_disable(&bfad->bfa); + fcport->cfg.trunked = BFA_TRUE; + } else if (v_cmd == IOCMD_TRUNK_DISABLE) { + trunk->attr.state = BFA_TRUNK_DISABLED; + bfa_fcport_disable(&bfad->bfa); + fcport->cfg.trunked = BFA_FALSE; + } + + if (!bfa_fcport_is_disabled(&bfad->bfa)) + bfa_fcport_enable(&bfad->bfa); + + spin_unlock_irqrestore(&bfad->bfad_lock, flags); + + iocmd->status = BFA_STATUS_OK; + return 0; +} + +int +bfad_iocmd_trunk_get_attr(struct bfad_s *bfad, void *cmd) +{ + struct bfa_bsg_trunk_attr_s *iocmd = (struct bfa_bsg_trunk_attr_s *)cmd; + struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa); + struct bfa_fcport_trunk_s *trunk = &fcport->trunk; + unsigned long flags; + + spin_lock_irqsave(&bfad->bfad_lock, flags); + memcpy((void *)&iocmd->attr, (void *)&trunk->attr, + sizeof(struct bfa_trunk_attr_s)); + iocmd->attr.port_id = bfa_lps_get_base_pid(&bfad->bfa); + spin_unlock_irqrestore(&bfad->bfad_lock, flags); + + iocmd->status = BFA_STATUS_OK; + return 0; +} + static int bfad_iocmd_handler(struct bfad_s *bfad, unsigned int cmd, void *iocmd, unsigned int payload_len) @@ -2470,6 +2517,13 @@ bfad_iocmd_handler(struct bfad_s *bfad, unsigned int cmd, void *iocmd, case IOCMD_ETHBOOT_QUERY: rc = bfad_iocmd_ethboot_query(bfad, iocmd); break; + case IOCMD_TRUNK_ENABLE: + case IOCMD_TRUNK_DISABLE: + rc = bfad_iocmd_cfg_trunk(bfad, iocmd, cmd); + break; + case IOCMD_TRUNK_GET_ATTR: + rc = bfad_iocmd_trunk_get_attr(bfad, iocmd); + break; default: rc = -EINVAL; break; diff --git a/trunk/drivers/scsi/bfa/bfad_bsg.h b/trunk/drivers/scsi/bfa/bfad_bsg.h index 95694cee0cd8..22680452ee1b 100644 --- a/trunk/drivers/scsi/bfa/bfad_bsg.h +++ b/trunk/drivers/scsi/bfa/bfad_bsg.h @@ -126,6 +126,9 @@ enum { IOCMD_PREBOOT_QUERY, IOCMD_ETHBOOT_CFG, IOCMD_ETHBOOT_QUERY, + IOCMD_TRUNK_ENABLE, + IOCMD_TRUNK_DISABLE, + IOCMD_TRUNK_GET_ATTR, }; struct bfa_bsg_gen_s { @@ -656,6 +659,13 @@ struct bfa_bsg_ethboot_s { struct bfa_ethboot_cfg_s cfg; }; +struct bfa_bsg_trunk_attr_s { + bfa_status_t status; + u16 bfad_num; + u16 rsvd; + struct bfa_trunk_attr_s attr; +}; + struct bfa_bsg_fcpt_s { bfa_status_t status; u16 vf_id;