LLDP MIB Change Event (opcode 0x0A01) already contains MIB, which
has been changed. Add ice_dcb_process_lldp_set_mib_change() function,
which will set local/remote DCBX config from LLDP MIB Change Event's
buffer.

This function will be used in a base driver handler for LLDP MIB
Change Event.

Signed-off-by: Anatolii Gerasymenko <anatolii.gerasyme...@intel.com>
Signed-off-by: Qi Zhang <qi.z.zh...@intel.com>
---
 drivers/net/ice/base/ice_dcb.c | 37 ++++++++++++++++++++++++++++++++++
 drivers/net/ice/base/ice_dcb.h |  2 ++
 2 files changed, 39 insertions(+)

diff --git a/drivers/net/ice/base/ice_dcb.c b/drivers/net/ice/base/ice_dcb.c
index d511a5f5ec..30494e868e 100644
--- a/drivers/net/ice/base/ice_dcb.c
+++ b/drivers/net/ice/base/ice_dcb.c
@@ -970,6 +970,43 @@ enum ice_status ice_get_dcb_cfg(struct ice_port_info *pi)
        return ret;
 }
 
+/**
+ * ice_get_dcb_cfg_from_mib_change
+ * @pi: port information structure
+ * @event: pointer to the admin queue receive event
+ *
+ * Set DCB configuration from received MIB Change event
+ */
+void ice_get_dcb_cfg_from_mib_change(struct ice_port_info *pi,
+                                    struct ice_rq_event_info *event)
+{
+       struct ice_dcbx_cfg *dcbx_cfg = &pi->qos_cfg.local_dcbx_cfg;
+       struct ice_aqc_lldp_get_mib *mib;
+       u8 change_type, dcbx_mode;
+
+       mib = (struct ice_aqc_lldp_get_mib *)&event->desc.params.raw;
+
+       change_type = mib->type & ICE_AQ_LLDP_MIB_TYPE_M;
+       if (change_type == ICE_AQ_LLDP_MIB_REMOTE)
+               dcbx_cfg = &pi->qos_cfg.remote_dcbx_cfg;
+
+       dcbx_mode = ((mib->type & ICE_AQ_LLDP_DCBX_M) >>
+                    ICE_AQ_LLDP_DCBX_S);
+
+       switch (dcbx_mode) {
+       case ICE_AQ_LLDP_DCBX_IEEE:
+               dcbx_cfg->dcbx_mode = ICE_DCBX_MODE_IEEE;
+               ice_lldp_to_dcb_cfg(event->msg_buf, dcbx_cfg);
+               break;
+
+       case ICE_AQ_LLDP_DCBX_CEE:
+               pi->qos_cfg.desired_dcbx_cfg = pi->qos_cfg.local_dcbx_cfg;
+               ice_cee_to_dcb_cfg((struct ice_aqc_get_cee_dcb_cfg_resp *)
+                                  event->msg_buf, pi);
+               break;
+       }
+}
+
 /**
  * ice_init_dcb
  * @hw: pointer to the HW struct
diff --git a/drivers/net/ice/base/ice_dcb.h b/drivers/net/ice/base/ice_dcb.h
index 24c8da2dc8..7e1e4d0297 100644
--- a/drivers/net/ice/base/ice_dcb.h
+++ b/drivers/net/ice/base/ice_dcb.h
@@ -205,6 +205,8 @@ ice_aq_get_dcb_cfg(struct ice_hw *hw, u8 mib_type, u8 
bridgetype,
                   struct ice_dcbx_cfg *dcbcfg);
 enum ice_status ice_get_dcb_cfg(struct ice_port_info *pi);
 enum ice_status ice_set_dcb_cfg(struct ice_port_info *pi);
+void ice_get_dcb_cfg_from_mib_change(struct ice_port_info *pi,
+                                    struct ice_rq_event_info *event);
 enum ice_status ice_init_dcb(struct ice_hw *hw, bool enable_mib_change);
 void ice_dcb_cfg_to_lldp(u8 *lldpmib, u16 *miblen, struct ice_dcbx_cfg 
*dcbcfg);
 enum ice_status
-- 
2.31.1

Reply via email to