qed: Add support for static dcbx.
authorsudarsana.kalluru@cavium.com <sudarsana.kalluru@cavium.com>
Fri, 21 Apr 2017 05:31:20 +0000 (22:31 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 24 Apr 2017 16:19:56 +0000 (12:19 -0400)
The patch adds driver support for static/local dcbx mode. In this mode
adapter brings up the dcbx link with locally configured parameters
instead of performing the dcbx negotiation with the peer. The feature
is useful when peer device/switch doesn't support dcbx.

Signed-off-by: Sudarsana Reddy Kalluru <Sudarsana.Kalluru@cavium.com>
Signed-off-by: Yuval Mintz <Yuval.Mintz@cavium.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/qlogic/qed/qed_dcbx.c
include/linux/qed/qed_if.h

index 40a4975443e42fe178c9413185259a5a50f6e467..233ca972738863025c60935da3467c32965ab3cc 100644 (file)
@@ -680,8 +680,14 @@ qed_dcbx_get_operational_params(struct qed_hwfn *p_hwfn,
                 DCBX_CONFIG_VERSION_CEE);
        p_operational->cee = val;
 
-       DP_VERBOSE(p_hwfn, QED_MSG_DCB, "Version support: ieee %d, cee %d\n",
-                  p_operational->ieee, p_operational->cee);
+       val = !!(QED_MFW_GET_FIELD(flags, DCBX_CONFIG_VERSION) ==
+                DCBX_CONFIG_VERSION_STATIC);
+       p_operational->local = val;
+
+       DP_VERBOSE(p_hwfn, QED_MSG_DCB,
+                  "Version support: ieee %d, cee %d, static %d\n",
+                  p_operational->ieee, p_operational->cee,
+                  p_operational->local);
 
        qed_dcbx_get_common_params(p_hwfn, &p_feat->app,
                                   p_feat->app.app_pri_tbl, &p_feat->ets,
@@ -1235,6 +1241,8 @@ int qed_dcbx_get_config_params(struct qed_hwfn *p_hwfn,
                p_hwfn->p_dcbx_info->set.ver_num |= DCBX_CONFIG_VERSION_CEE;
        if (dcbx_info->operational.ieee)
                p_hwfn->p_dcbx_info->set.ver_num |= DCBX_CONFIG_VERSION_IEEE;
+       if (dcbx_info->operational.local)
+               p_hwfn->p_dcbx_info->set.ver_num |= DCBX_CONFIG_VERSION_STATIC;
 
        p_hwfn->p_dcbx_info->set.enabled = dcbx_info->operational.enabled;
        memcpy(&p_hwfn->p_dcbx_info->set.config.params,
@@ -1784,8 +1792,9 @@ static u8 qed_dcbnl_setdcbx(struct qed_dev *cdev, u8 mode)
 
        DP_VERBOSE(hwfn, QED_MSG_DCB, "new mode = %x\n", mode);
 
-       if (!(mode & DCB_CAP_DCBX_VER_IEEE) && !(mode & DCB_CAP_DCBX_VER_CEE)) {
-               DP_INFO(hwfn, "Allowed mode is cee, ieee or both\n");
+       if (!(mode & DCB_CAP_DCBX_VER_IEEE) &&
+           !(mode & DCB_CAP_DCBX_VER_CEE) && !(mode & DCB_CAP_DCBX_STATIC)) {
+               DP_INFO(hwfn, "Allowed modes are cee, ieee or static\n");
                return 1;
        }
 
@@ -1805,6 +1814,11 @@ static u8 qed_dcbnl_setdcbx(struct qed_dev *cdev, u8 mode)
                dcbx_set.enabled = true;
        }
 
+       if (mode & DCB_CAP_DCBX_STATIC) {
+               dcbx_set.ver_num |= DCBX_CONFIG_VERSION_STATIC;
+               dcbx_set.enabled = true;
+       }
+
        ptt = qed_ptt_acquire(hwfn);
        if (!ptt)
                return 1;
@@ -1813,7 +1827,7 @@ static u8 qed_dcbnl_setdcbx(struct qed_dev *cdev, u8 mode)
 
        qed_ptt_release(hwfn, ptt);
 
-       return 0;
+       return rc;
 }
 
 static u8 qed_dcbnl_getfeatcfg(struct qed_dev *cdev, int featid, u8 *flags)
index d44933a058ee6d71846beca649843152a6f87180..9f966be8951065d55fcac1fda0d13fdd1586cb39 100644 (file)
@@ -144,6 +144,7 @@ struct qed_dcbx_operational_params {
        bool enabled;
        bool ieee;
        bool cee;
+       bool local;
        u32 err;
 };