net/ice: revert fake TSO fixes
[dpdk.git] / drivers / net / ice / base / ice_dcb.c
index a781057..b9643b5 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2001-2019
+ * Copyright(c) 2001-2020 Intel Corporation
  */
 
 #include "ice_common.h"
@@ -83,12 +83,14 @@ ice_aq_cfg_lldp_mib_change(struct ice_hw *hw, bool ena_update,
  * @hw: pointer to the HW struct
  * @shutdown_lldp_agent: True if LLDP Agent needs to be Shutdown
  *                      False if LLDP Agent needs to be Stopped
+ * @persist: True if Stop/Shutdown of LLDP Agent needs to be persistent across
+ *          reboots
  * @cd: pointer to command details structure or NULL
  *
  * Stop or Shutdown the embedded LLDP Agent (0x0A05)
  */
 enum ice_status
-ice_aq_stop_lldp(struct ice_hw *hw, bool shutdown_lldp_agent,
+ice_aq_stop_lldp(struct ice_hw *hw, bool shutdown_lldp_agent, bool persist,
                 struct ice_sq_cd *cd)
 {
        struct ice_aqc_lldp_stop *cmd;
@@ -101,17 +103,22 @@ ice_aq_stop_lldp(struct ice_hw *hw, bool shutdown_lldp_agent,
        if (shutdown_lldp_agent)
                cmd->command |= ICE_AQ_LLDP_AGENT_SHUTDOWN;
 
+       if (persist)
+               cmd->command |= ICE_AQ_LLDP_AGENT_PERSIST_DIS;
+
        return ice_aq_send_cmd(hw, &desc, NULL, 0, cd);
 }
 
 /**
  * ice_aq_start_lldp
  * @hw: pointer to the HW struct
+ * @persist: True if Start of LLDP Agent needs to be persistent across reboots
  * @cd: pointer to command details structure or NULL
  *
  * Start the embedded LLDP Agent on all ports. (0x0A06)
  */
-enum ice_status ice_aq_start_lldp(struct ice_hw *hw, struct ice_sq_cd *cd)
+enum ice_status
+ice_aq_start_lldp(struct ice_hw *hw, bool persist, struct ice_sq_cd *cd)
 {
        struct ice_aqc_lldp_start *cmd;
        struct ice_aq_desc desc;
@@ -122,40 +129,10 @@ enum ice_status ice_aq_start_lldp(struct ice_hw *hw, struct ice_sq_cd *cd)
 
        cmd->command = ICE_AQ_LLDP_AGENT_START;
 
-       return ice_aq_send_cmd(hw, &desc, NULL, 0, cd);
-}
-
-/**
- * ice_aq_set_lldp_mib - Set the LLDP MIB
- * @hw: pointer to the HW struct
- * @mib_type: Local, Remote or both Local and Remote MIBs
- * @buf: pointer to the caller-supplied buffer to store the MIB block
- * @buf_size: size of the buffer (in bytes)
- * @cd: pointer to command details structure or NULL
- *
- * Set the LLDP MIB. (0x0A08)
- */
-enum ice_status
-ice_aq_set_lldp_mib(struct ice_hw *hw, u8 mib_type, void *buf, u16 buf_size,
-                   struct ice_sq_cd *cd)
-{
-       struct ice_aqc_lldp_set_local_mib *cmd;
-       struct ice_aq_desc desc;
-
-       cmd = &desc.params.lldp_set_mib;
-
-       if (buf_size == 0 || !buf)
-               return ICE_ERR_PARAM;
-
-       ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_lldp_set_local_mib);
-
-       desc.flags |= CPU_TO_LE16((u16)ICE_AQ_FLAG_RD);
-       desc.datalen = CPU_TO_LE16(buf_size);
-
-       cmd->type = mib_type;
-       cmd->length = CPU_TO_LE16(buf_size);
+       if (persist)
+               cmd->command |= ICE_AQ_LLDP_AGENT_PERSIST_ENA;
 
-       return ice_aq_send_cmd(hw, &desc, buf, buf_size, cd);
+       return ice_aq_send_cmd(hw, &desc, NULL, 0, cd);
 }
 
 /**
@@ -435,9 +412,15 @@ ice_parse_cee_pgcfg_tlv(struct ice_cee_feat_tlv *tlv,
         *        |pg0|pg1|pg2|pg3|pg4|pg5|pg6|pg7|
         *        ---------------------------------
         */
-       ice_for_each_traffic_class(i)
+       ice_for_each_traffic_class(i) {
                etscfg->tcbwtable[i] = buf[offset++];
 
+               if (etscfg->prio_table[i] == ICE_CEE_PGID_STRICT)
+                       dcbcfg->etscfg.tsatable[i] = ICE_IEEE_TSA_STRICT;
+               else
+                       dcbcfg->etscfg.tsatable[i] = ICE_IEEE_TSA_ETS;
+       }
+
        /* Number of TCs supported (1 octet) */
        etscfg->maxtcs = buf[offset];
 }
@@ -659,7 +642,7 @@ enum ice_status ice_lldp_to_dcb_cfg(u8 *lldpmib, struct ice_dcbx_cfg *dcbcfg)
 /**
  * ice_aq_get_dcb_cfg
  * @hw: pointer to the HW struct
- * @mib_type: mib type for the query
+ * @mib_type: MIB type for the query
  * @bridgetype: bridge type for the query (remote)
  * @dcbcfg: store for LLDPDU data
  *
@@ -690,13 +673,13 @@ ice_aq_get_dcb_cfg(struct ice_hw *hw, u8 mib_type, u8 bridgetype,
 }
 
 /**
- * ice_aq_start_stop_dcbx - Start/Stop DCBx service in FW
+ * ice_aq_start_stop_dcbx - Start/Stop DCBX service in FW
  * @hw: pointer to the HW struct
- * @start_dcbx_agent: True if DCBx Agent needs to be started
- *                   False if DCBx Agent needs to be stopped
- * @dcbx_agent_status: FW indicates back the DCBx agent status
- *                    True if DCBx Agent is active
- *                    False if DCBx Agent is stopped
+ * @start_dcbx_agent: True if DCBX Agent needs to be started
+ *                   False if DCBX Agent needs to be stopped
+ * @dcbx_agent_status: FW indicates back the DCBX agent status
+ *                    True if DCBX Agent is active
+ *                    False if DCBX Agent is stopped
  * @cd: pointer to command details structure or NULL
  *
  * Start/Stop the embedded dcbx Agent. In case that this wrapper function
@@ -927,10 +910,11 @@ enum ice_status ice_get_dcb_cfg(struct ice_port_info *pi)
 /**
  * ice_init_dcb
  * @hw: pointer to the HW struct
+ * @enable_mib_change: enable MIB change event
  *
  * Update DCB configuration from the Firmware
  */
-enum ice_status ice_init_dcb(struct ice_hw *hw)
+enum ice_status ice_init_dcb(struct ice_hw *hw, bool enable_mib_change)
 {
        struct ice_port_info *pi = hw->port_info;
        enum ice_status ret = ICE_SUCCESS;
@@ -944,21 +928,51 @@ enum ice_status ice_init_dcb(struct ice_hw *hw)
        pi->dcbx_status = ice_get_dcbx_status(hw);
 
        if (pi->dcbx_status == ICE_DCBX_STATUS_DONE ||
-           pi->dcbx_status == ICE_DCBX_STATUS_IN_PROGRESS) {
+           pi->dcbx_status == ICE_DCBX_STATUS_IN_PROGRESS ||
+           pi->dcbx_status == ICE_DCBX_STATUS_NOT_STARTED) {
                /* Get current DCBX configuration */
                ret = ice_get_dcb_cfg(pi);
-               pi->is_sw_lldp = (hw->adminq.sq_last_status == ICE_AQ_RC_EPERM);
                if (ret)
                        return ret;
+               pi->is_sw_lldp = false;
        } else if (pi->dcbx_status == ICE_DCBX_STATUS_DIS) {
                return ICE_ERR_NOT_READY;
-       } else if (pi->dcbx_status == ICE_DCBX_STATUS_MULTIPLE_PEERS) {
        }
 
        /* Configure the LLDP MIB change event */
-       ret = ice_aq_cfg_lldp_mib_change(hw, true, NULL);
+       if (enable_mib_change) {
+               ret = ice_aq_cfg_lldp_mib_change(hw, true, NULL);
+               if (ret)
+                       pi->is_sw_lldp = true;
+       }
+
+       return ret;
+}
+
+/**
+ * ice_cfg_lldp_mib_change
+ * @hw: pointer to the HW struct
+ * @ena_mib: enable/disable MIB change event
+ *
+ * Configure (disable/enable) MIB
+ */
+enum ice_status ice_cfg_lldp_mib_change(struct ice_hw *hw, bool ena_mib)
+{
+       struct ice_port_info *pi = hw->port_info;
+       enum ice_status ret;
+
+       if (!hw->func_caps.common_cap.dcb)
+               return ICE_ERR_NOT_SUPPORTED;
+
+       /* Get DCBX status */
+       pi->dcbx_status = ice_get_dcbx_status(hw);
+
+       if (pi->dcbx_status == ICE_DCBX_STATUS_DIS)
+               return ICE_ERR_NOT_READY;
+
+       ret = ice_aq_cfg_lldp_mib_change(hw, ena_mib, NULL);
        if (!ret)
-               pi->is_sw_lldp = false;
+               pi->is_sw_lldp = !ena_mib;
 
        return ret;
 }
@@ -1205,7 +1219,7 @@ ice_add_dcb_tlv(struct ice_lldp_org_tlv *tlv, struct ice_dcbx_cfg *dcbcfg,
 /**
  * ice_dcb_cfg_to_lldp - Convert DCB configuration to MIB format
  * @lldpmib: pointer to the HW struct
- * @miblen: length of LLDP mib
+ * @miblen: length of LLDP MIB
  * @dcbcfg: Local store which holds the DCB Config
  *
  * Convert the DCB configuration to MIB format
@@ -1275,13 +1289,13 @@ enum ice_status ice_set_dcb_cfg(struct ice_port_info *pi)
 }
 
 /**
- * ice_aq_query_port_ets - query port ets configuration
+ * ice_aq_query_port_ets - query port ETS configuration
  * @pi: port information structure
  * @buf: pointer to buffer
  * @buf_size: buffer size in bytes
  * @cd: pointer to command details structure or NULL
  *
- * query current port ets configuration
+ * query current port ETS configuration
  */
 enum ice_status
 ice_aq_query_port_ets(struct ice_port_info *pi,
@@ -1368,13 +1382,13 @@ ice_update_port_tc_tree_cfg(struct ice_port_info *pi,
 }
 
 /**
- * ice_query_port_ets - query port ets configuration
+ * ice_query_port_ets - query port ETS configuration
  * @pi: port information structure
  * @buf: pointer to buffer
  * @buf_size: buffer size in bytes
  * @cd: pointer to command details structure or NULL
  *
- * query current port ets configuration and update the
+ * query current port ETS configuration and update the
  * SW DB with the TC changes
  */
 enum ice_status