]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - drivers/net/ixgbe/ixgbe_dcb_nl.c
ixgbe: Add support for multiple Tx queues for FCoE in 82599
[net-next-2.6.git] / drivers / net / ixgbe / ixgbe_dcb_nl.c
index 1c7265732900643ce27365c23212613c9d674c8d..a6bc1ef28f92bdf8d390b5295df996ab56c8b145 100644 (file)
@@ -36,6 +36,7 @@
 #define BIT_PFC                0x02
 #define BIT_PG_RX      0x04
 #define BIT_PG_TX      0x08
+#define BIT_APP_UPCHG  0x10
 #define BIT_RESETLINK   0x40
 #define BIT_LINKSPEED   0x80
 
@@ -139,18 +140,6 @@ static u8 ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state)
                        adapter->flags &= ~IXGBE_FLAG_FDIR_PERFECT_CAPABLE;
                }
                adapter->flags |= IXGBE_FLAG_DCB_ENABLED;
-#ifdef IXGBE_FCOE
-               /* Turn on FCoE offload */
-               if ((adapter->flags & IXGBE_FLAG_FCOE_CAPABLE) &&
-                   (!(adapter->flags & IXGBE_FLAG_FCOE_ENABLED))) {
-                       adapter->flags |= IXGBE_FLAG_FCOE_ENABLED;
-                       adapter->ring_feature[RING_F_FCOE].indices =
-                               IXGBE_FCRETA_SIZE;
-                       netdev->features |= NETIF_F_FCOE_CRC;
-                       netdev->features |= NETIF_F_FSO;
-                       netdev->fcoe_ddp_xid = IXGBE_FCOE_DDP_MAX - 1;
-               }
-#endif /* IXGBE_FCOE */
                ixgbe_init_interrupt_scheme(adapter);
                if (netif_running(netdev))
                        netdev->netdev_ops->ndo_open(netdev);
@@ -169,17 +158,6 @@ static u8 ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state)
                        if (adapter->hw.mac.type == ixgbe_mac_82599EB)
                                adapter->flags |= IXGBE_FLAG_FDIR_HASH_CAPABLE;
 
-#ifdef IXGBE_FCOE
-                       /* Turn off FCoE offload */
-                       if (adapter->flags & (IXGBE_FLAG_FCOE_CAPABLE |
-                            IXGBE_FLAG_FCOE_ENABLED)) {
-                               adapter->flags &= ~IXGBE_FLAG_FCOE_ENABLED;
-                               adapter->ring_feature[RING_F_FCOE].indices = 0;
-                               netdev->features &= ~NETIF_F_FCOE_CRC;
-                               netdev->features &= ~NETIF_F_FSO;
-                               netdev->fcoe_ddp_xid = 0;
-                       }
-#endif /* IXGBE_FCOE */
                        ixgbe_init_interrupt_scheme(adapter);
                        if (netif_running(netdev))
                                netdev->netdev_ops->ndo_open(netdev);
@@ -371,8 +349,14 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev)
                while (test_and_set_bit(__IXGBE_RESETTING, &adapter->state))
                        msleep(1);
 
-               if (netif_running(netdev))
-                       ixgbe_down(adapter);
+               if (adapter->dcb_set_bitmap & BIT_APP_UPCHG) {
+                       if (netif_running(netdev))
+                               netdev->netdev_ops->ndo_stop(netdev);
+                       ixgbe_clear_interrupt_scheme(adapter);
+               } else {
+                       if (netif_running(netdev))
+                               ixgbe_down(adapter);
+               }
        }
 
        ret = ixgbe_copy_dcb_cfg(&adapter->temp_dcb_cfg, &adapter->dcb_cfg,
@@ -396,8 +380,14 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev)
        }
 
        if (adapter->dcb_set_bitmap & BIT_RESETLINK) {
-               if (netif_running(netdev))
-                       ixgbe_up(adapter);
+               if (adapter->dcb_set_bitmap & BIT_APP_UPCHG) {
+                       ixgbe_init_interrupt_scheme(adapter);
+                       if (netif_running(netdev))
+                               netdev->netdev_ops->ndo_open(netdev);
+               } else {
+                       if (netif_running(netdev))
+                               ixgbe_up(adapter);
+               }
                ret = DCB_HW_CHG_RST;
        } else if (adapter->dcb_set_bitmap & BIT_PFC) {
                if (adapter->hw.mac.type == ixgbe_mac_82598EB)
@@ -503,6 +493,76 @@ static void ixgbe_dcbnl_setpfcstate(struct net_device *netdev, u8 state)
        return;
 }
 
+/**
+ * ixgbe_dcbnl_getapp - retrieve the DCBX application user priority
+ * @netdev : the corresponding netdev
+ * @idtype : identifies the id as ether type or TCP/UDP port number
+ * @id: id is either ether type or TCP/UDP port number
+ *
+ * Returns : on success, returns a non-zero 802.1p user priority bitmap
+ * otherwise returns 0 as the invalid user priority bitmap to indicate an
+ * error.
+ */
+static u8 ixgbe_dcbnl_getapp(struct net_device *netdev, u8 idtype, u16 id)
+{
+       u8 rval = 0;
+
+       switch (idtype) {
+       case DCB_APP_IDTYPE_ETHTYPE:
+#ifdef IXGBE_FCOE
+               if (id == ETH_P_FCOE)
+                       rval = ixgbe_fcoe_getapp(netdev_priv(netdev));
+#endif
+               break;
+       case DCB_APP_IDTYPE_PORTNUM:
+               break;
+       default:
+               break;
+       }
+       return rval;
+}
+
+/**
+ * ixgbe_dcbnl_setapp - set the DCBX application user priority
+ * @netdev : the corresponding netdev
+ * @idtype : identifies the id as ether type or TCP/UDP port number
+ * @id: id is either ether type or TCP/UDP port number
+ * @up: the 802.1p user priority bitmap
+ *
+ * Returns : 0 on success or 1 on error
+ */
+static u8 ixgbe_dcbnl_setapp(struct net_device *netdev,
+                             u8 idtype, u16 id, u8 up)
+{
+       u8 rval = 1;
+
+       switch (idtype) {
+       case DCB_APP_IDTYPE_ETHTYPE:
+#ifdef IXGBE_FCOE
+               if (id == ETH_P_FCOE) {
+                       u8 tc;
+                       struct ixgbe_adapter *adapter;
+
+                       adapter = netdev_priv(netdev);
+                       tc = adapter->fcoe.tc;
+                       rval = ixgbe_fcoe_setapp(adapter, up);
+                       if ((!rval) && (tc != adapter->fcoe.tc) &&
+                           (adapter->flags & IXGBE_FLAG_DCB_ENABLED) &&
+                           (adapter->flags & IXGBE_FLAG_FCOE_ENABLED)) {
+                               adapter->dcb_set_bitmap |= BIT_APP_UPCHG;
+                               adapter->dcb_set_bitmap |= BIT_RESETLINK;
+                       }
+               }
+#endif
+               break;
+       case DCB_APP_IDTYPE_PORTNUM:
+               break;
+       default:
+               break;
+       }
+       return rval;
+}
+
 struct dcbnl_rtnl_ops dcbnl_ops = {
        .getstate       = ixgbe_dcbnl_get_state,
        .setstate       = ixgbe_dcbnl_set_state,
@@ -523,5 +583,7 @@ struct dcbnl_rtnl_ops dcbnl_ops = {
        .setnumtcs      = ixgbe_dcbnl_setnumtcs,
        .getpfcstate    = ixgbe_dcbnl_getpfcstate,
        .setpfcstate    = ixgbe_dcbnl_setpfcstate,
+       .getapp         = ixgbe_dcbnl_getapp,
+       .setapp         = ixgbe_dcbnl_setapp,
 };