cxgb4: update supported DCB version
authorGanesh Goudar <ganeshgr@chelsio.com>
Fri, 14 Sep 2018 12:05:55 +0000 (17:35 +0530)
committerDavid S. Miller <davem@davemloft.net>
Fri, 14 Sep 2018 15:50:23 +0000 (08:50 -0700)
- In CXGB4_DCB_STATE_FW_INCOMPLETE state check if the dcb
  version is changed and update the dcb supported version.

- Also, fill the priority code point value for priority
  based flow control.

Signed-off-by: Ganesh Goudar <ganeshgr@chelsio.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/chelsio/cxgb4/cxgb4_dcb.c
drivers/net/ethernet/chelsio/cxgb4/l2t.c

index b34f0f0..6ba3104 100644 (file)
@@ -114,6 +114,24 @@ void cxgb4_dcb_reset(struct net_device *dev)
        cxgb4_dcb_state_init(dev);
 }
 
+/* update the dcb port support, if version is IEEE then set it to
+ * FW_PORT_DCB_VER_IEEE and if DCB_CAP_DCBX_VER_CEE is already set then
+ * clear that. and if it is set to CEE then set dcb supported to
+ * DCB_CAP_DCBX_VER_CEE & if DCB_CAP_DCBX_VER_IEEE is set, clear it
+ */
+static inline void cxgb4_dcb_update_support(struct port_dcb_info *dcb)
+{
+       if (dcb->dcb_version == FW_PORT_DCB_VER_IEEE) {
+               if (dcb->supported & DCB_CAP_DCBX_VER_CEE)
+                       dcb->supported &= ~DCB_CAP_DCBX_VER_CEE;
+               dcb->supported |= DCB_CAP_DCBX_VER_IEEE;
+       } else if (dcb->dcb_version == FW_PORT_DCB_VER_CEE1D01) {
+               if (dcb->supported & DCB_CAP_DCBX_VER_IEEE)
+                       dcb->supported &= ~DCB_CAP_DCBX_VER_IEEE;
+               dcb->supported |= DCB_CAP_DCBX_VER_CEE;
+       }
+}
+
 /* Finite State machine for Data Center Bridging.
  */
 void cxgb4_dcb_state_fsm(struct net_device *dev,
@@ -165,6 +183,15 @@ void cxgb4_dcb_state_fsm(struct net_device *dev,
        }
 
        case CXGB4_DCB_STATE_FW_INCOMPLETE: {
+               if (transition_to != CXGB4_DCB_INPUT_FW_DISABLED) {
+                       /* during this CXGB4_DCB_STATE_FW_INCOMPLETE state,
+                        * check if the dcb version is changed (there can be
+                        * mismatch in default config & the negotiated switch
+                        * configuration at FW, so update the dcb support
+                        * accordingly.
+                        */
+                       cxgb4_dcb_update_support(dcb);
+               }
                switch (transition_to) {
                case CXGB4_DCB_INPUT_FW_ENABLED: {
                        /* we're alreaady in firmware DCB mode */
index 301c4df..99022c0 100644 (file)
@@ -433,10 +433,12 @@ struct l2t_entry *cxgb4_l2t_get(struct l2t_data *d, struct neighbour *neigh,
        else
                lport = netdev2pinfo(physdev)->lport;
 
-       if (is_vlan_dev(neigh->dev))
+       if (is_vlan_dev(neigh->dev)) {
                vlan = vlan_dev_vlan_id(neigh->dev);
-       else
+               vlan |= vlan_dev_get_egress_qos_mask(neigh->dev, priority);
+       } else {
                vlan = VLAN_NONE;
+       }
 
        write_lock_bh(&d->lock);
        for (e = d->l2tab[hash].first; e; e = e->next)