i40e/base: store CEE DCBX config
authorJingjing Wu <jingjing.wu@intel.com>
Sun, 6 Sep 2015 07:11:35 +0000 (15:11 +0800)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Thu, 1 Oct 2015 23:35:22 +0000 (01:35 +0200)
This patch adds capability to query and store the CEE DCBX DesiredCfg
and RemoteCfg data from the LLDP MIB.
Added new member "desired_dcbx_config" in the i40e_hw data structure
to hold CEE only DesiredCfg data.

Store the CEE TLV status returned by firmware to allow drivers to dump that
for debug purposes.

Signed-off-by: Jingjing Wu <jingjing.wu@intel.com>
Acked-by: Helin Zhang <helin.zhang@intel.com>
Tested-by: Huilong Xu <huilongx.xu@intel.com>
drivers/net/i40e/base/i40e_dcb.c
drivers/net/i40e/base/i40e_type.h

index ab4decd..65d74fa 100644 (file)
@@ -759,6 +759,36 @@ static void i40e_cee_to_dcb_config(
        }
 }
 
+/**
+ * i40e_get_ieee_dcb_config
+ * @hw: pointer to the hw struct
+ *
+ * Get IEEE mode DCB configuration from the Firmware
+ **/
+STATIC enum i40e_status_code i40e_get_ieee_dcb_config(struct i40e_hw *hw)
+{
+       enum i40e_status_code ret = I40E_SUCCESS;
+
+       /* IEEE mode */
+       hw->local_dcbx_config.dcbx_mode = I40E_DCBX_MODE_IEEE;
+       /* Get Local DCB Config */
+       ret = i40e_aq_get_dcb_config(hw, I40E_AQ_LLDP_MIB_LOCAL, 0,
+                                    &hw->local_dcbx_config);
+       if (ret)
+               goto out;
+
+       /* Get Remote DCB Config */
+       ret = i40e_aq_get_dcb_config(hw, I40E_AQ_LLDP_MIB_REMOTE,
+                                    I40E_AQ_LLDP_BRIDGE_TYPE_NEAREST_BRIDGE,
+                                    &hw->remote_dcbx_config);
+       /* Don't treat ENOENT as an error for Remote MIBs */
+       if (hw->aq.asq_last_status == I40E_AQ_RC_ENOENT)
+               ret = I40E_SUCCESS;
+
+out:
+       return ret;
+}
+
 /**
  * i40e_get_dcb_config
  * @hw: pointer to the hw struct
@@ -774,7 +804,7 @@ enum i40e_status_code i40e_get_dcb_config(struct i40e_hw *hw)
        /* If Firmware version < v4.33 IEEE only */
        if (((hw->aq.fw_maj_ver == 4) && (hw->aq.fw_min_ver < 33)) ||
            (hw->aq.fw_maj_ver < 4))
-               goto ieee;
+               return i40e_get_ieee_dcb_config(hw);
 
        /* If Firmware version == v4.33 use old CEE struct */
        if ((hw->aq.fw_maj_ver == 4) && (hw->aq.fw_min_ver == 33)) {
@@ -783,6 +813,8 @@ enum i40e_status_code i40e_get_dcb_config(struct i40e_hw *hw)
                if (ret == I40E_SUCCESS) {
                        /* CEE mode */
                        hw->local_dcbx_config.dcbx_mode = I40E_DCBX_MODE_CEE;
+                       hw->local_dcbx_config.tlv_status =
+                                       LE16_TO_CPU(cee_v1_cfg.tlv_status);
                        i40e_cee_to_dcb_v1_config(&cee_v1_cfg,
                                                  &hw->local_dcbx_config);
                }
@@ -792,6 +824,8 @@ enum i40e_status_code i40e_get_dcb_config(struct i40e_hw *hw)
                if (ret == I40E_SUCCESS) {
                        /* CEE mode */
                        hw->local_dcbx_config.dcbx_mode = I40E_DCBX_MODE_CEE;
+                       hw->local_dcbx_config.tlv_status =
+                                       LE32_TO_CPU(cee_cfg.tlv_status);
                        i40e_cee_to_dcb_config(&cee_cfg,
                                               &hw->local_dcbx_config);
                }
@@ -799,16 +833,14 @@ enum i40e_status_code i40e_get_dcb_config(struct i40e_hw *hw)
 
        /* CEE mode not enabled try querying IEEE data */
        if (hw->aq.asq_last_status == I40E_AQ_RC_ENOENT)
-               goto ieee;
-       else
+               return i40e_get_ieee_dcb_config(hw);
+
+       if (ret != I40E_SUCCESS)
                goto out;
 
-ieee:
-       /* IEEE mode */
-       hw->local_dcbx_config.dcbx_mode = I40E_DCBX_MODE_IEEE;
-       /* Get Local DCB Config */
+       /* Get CEE DCB Desired Config */
        ret = i40e_aq_get_dcb_config(hw, I40E_AQ_LLDP_MIB_LOCAL, 0,
-                                    &hw->local_dcbx_config);
+                                    &hw->desired_dcbx_config);
        if (ret)
                goto out;
 
index ef75212..264ce11 100644 (file)
@@ -555,6 +555,7 @@ struct i40e_dcbx_config {
        u8  app_mode;
 #define I40E_DCBX_APPS_NON_WILLING     0x1
        u32 numapps;
+       u32 tlv_status; /* CEE mode TLV status */
        struct i40e_dcb_ets_config etscfg;
        struct i40e_dcb_ets_config etsrec;
        struct i40e_dcb_pfc_config pfc;
@@ -616,8 +617,9 @@ struct i40e_hw {
        u16 dcbx_status;
 
        /* DCBX info */
-       struct i40e_dcbx_config local_dcbx_config;
-       struct i40e_dcbx_config remote_dcbx_config;
+       struct i40e_dcbx_config local_dcbx_config; /* Oper/Local Cfg */
+       struct i40e_dcbx_config remote_dcbx_config; /* Peer Cfg */
+       struct i40e_dcbx_config desired_dcbx_config; /* CEE Desired Cfg */
 
        /* debug mask */
        u32 debug_mask;