[SCSI] bfa: Add support to configure trunking on Brocade adapter ports.
authorKrishna Gudipati <kgudipat@brocade.com>
Thu, 21 Jul 2011 00:02:50 +0000 (17:02 -0700)
committerJames Bottomley <JBottomley@Parallels.com>
Wed, 27 Jul 2011 10:51:11 +0000 (14:51 +0400)
- Added logic to enable / disable trunking on Brocade adapter ports.
- Added logic to query trunking info.

Signed-off-by: Krishna Gudipati <kgudipat@brocade.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/bfa/bfad_bsg.c
drivers/scsi/bfa/bfad_bsg.h

index f782ee4b88688f4b66e43d0f35842e8392d1f166..55a9180b0a39d06a9b0a1d89b03bf281d77d8d5d 100644 (file)
@@ -2181,6 +2181,53 @@ out:
        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;
index 95694cee0cd810c9b12ae2576ec0cb88fb0aa44a..22680452ee1ba13bc7ede528aeeeda1131068869 100644 (file)
@@ -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;