ixgbe: this patch adds support for DCB to the kernel and ixgbe driver
Subsystems (2)
PATCH 1/6 ixgbe: this patch adds support for DCB to the kernel and ixgbe driver
From: Alexander Duyck <[email protected]>
---
drivers/net/ixgbe/Makefile | 3 drivers/net/ixgbe/ixgbe.h | 26 + drivers/net/ixgbe/ixgbe_dcb.c | 332 +++++++++++++++++ drivers/net/ixgbe/ixgbe_dcb.h | 158 ++++++++ drivers/net/ixgbe/ixgbe_dcb_82598.c | 398 ++++++++++++++++++++ drivers/net/ixgbe/ixgbe_dcb_82598.h | 94 +++++ drivers/net/ixgbe/ixgbe_dcb_nl.c | 352 ++++++++++++++++++ drivers/net/ixgbe/ixgbe_ethtool.c | 37 ++ drivers/net/ixgbe/ixgbe_main.c | 189 +++++++++- include/linux/dcbnl.h | 230 ++++++++++++ include/linux/netdevice.h | 8 include/linux/rtnetlink.h | 5 include/net/dcbnl.h | 44 ++ net/Kconfig | 1 net/Makefile | 3 net/dcb/Kconfig | 12 + net/dcb/Makefile | 1 net/dcb/dcbnl.c | 682 +++++++++++++++++++++++++++++++++++ 18 files changed, 2555 insertions(+), 20 deletions(-) create mode 100644 drivers/net/ixgbe/ixgbe_dcb.c create mode 100644 drivers/net/ixgbe/ixgbe_dcb.h create mode 100644 drivers/net/ixgbe/ixgbe_dcb_82598.c create mode 100644 drivers/net/ixgbe/ixgbe_dcb_82598.h create mode 100644 drivers/net/ixgbe/ixgbe_dcb_nl.c create mode 100644 include/linux/dcbnl.h create mode 100644 include/net/dcbnl.h create mode 100644 net/dcb/Kconfig create mode 100644 net/dcb/Makefile create mode 100644 net/dcb/dcbnl.c
drivers/net/ixgbe/Makefile +2 -1
@@ -33,4 +33,5 @@ obj-$(CONFIG_IXGBE) += ixgbe.o ixgbe-objs := ixgbe_main.o ixgbe_common.o ixgbe_ethtool.o \ - ixgbe_82598.o ixgbe_phy.o + ixgbe_82598.o ixgbe_phy.o ixgbe_dcb.o ixgbe_dcb_82598.o \ + ixgbe_dcb_nl.o
drivers/net/ixgbe/ixgbe.h +24 -2
@@ -35,6 +35,7 @@#include "ixgbe_type.h" #include "ixgbe_common.h" +#include "ixgbe_dcb.h" #if defined(CONFIG_DCA ) || defined(CONFIG_DCA_MODULE )#include <linux/dca.h>
@@ -84,6 +85,7 @@#define IXGBE_TX_FLAGS_TSO (u32)(1 << 2)#define IXGBE_TX_FLAGS_IPV4 (u32)(1 << 3)#define IXGBE_TX_FLAGS_VLAN_MASK 0xffff0000 +#define IXGBE_TX_FLAGS_VLAN_PRIO_MASK 0x0000e000#define IXGBE_TX_FLAGS_VLAN_SHIFT 16#define IXGBE_MAX_LRO_DESCRIPTORS 8
@@ -134,7 +136,7 @@ struct ixgbe_ring {u16 reg_idx;/* holds the special value that gets the hardware register * offset associated with this ring, which is different -* for DCE and RSS modes */ +* for DCB and RSS modes */ #if defined(CONFIG_DCA ) || defined(CONFIG_DCA_MODULE )/* cpu for tx queue */
@@ -152,8 +154,10 @@ struct ixgbe_ring {u16 rx_buf_len; }; +#define RING_F_DCB 0#define RING_F_VMDQ 1#define RING_F_RSS 2 +#define IXGBE_MAX_DCB_INDICES 8#define IXGBE_MAX_RSS_INDICES 16#define IXGBE_MAX_VMDQ_INDICES 16struct ixgbe_ring_feature {
@@ -164,6 +168,10 @@ struct ixgbe_ring_feature {#define MAX_RX_QUEUES 64#define MAX_TX_QUEUES 32 +#define MAX_RX_PACKET_BUFFERS ((adapter->flags & IXGBE_FLAG_DCB_ENABLED) \ + ? 8 : 1) +#define MAX_TX_PACKET_BUFFERS MAX_RX_PACKET_BUFFERS +/* MAX_MSIX_Q_VECTORS of these are allocated, * but we only use one per queue-specific vector. */
@@ -215,6 +223,9 @@ struct ixgbe_adapter {struct work_struct reset_task;struct ixgbe_q_vector q_vector[MAX_MSIX_Q_VECTORS ];char name[MAX_MSIX_COUNT ][IFNAMSIZ +5 ]; +struct ixgbe_dcb_config dcb_cfg; +struct ixgbe_dcb_config temp_dcb_cfg; +u8 dcb_set_bitmap;/* Interrupt Throttle Rate */ u32 itr_setting;
@@ -269,6 +280,7 @@ struct ixgbe_adapter {#define IXGBE_FLAG_VMDQ_ENABLED (u32)(1 << 19)#define IXGBE_FLAG_NEED_LINK_UPDATE (u32)(1 << 22)#define IXGBE_FLAG_IN_WATCHDOG_TASK (u32)(1 << 23) +#define IXGBE_FLAG_DCB_ENABLED (u32)(1 << 24)/* default to trying for four seconds */ #define IXGBE_TRY_LINK_TIMEOUT (4 * HZ)
@@ -312,6 +324,13 @@ enum ixgbe_boards { };extern struct ixgbe_info ixgbe_82598_info; +#ifdef CONFIG_DCBNL +extern struct dcbnl_rtnl_ops dcbnl_ops; +extern int ixgbe_copy_dcb_cfg (struct ixgbe_dcb_config *src_dcb_cfg, +struct ixgbe_dcb_config *dst_dcb_cfg,int tc_max); +#endif + +extern char ixgbe_driver_name[];extern const char ixgbe_driver_version[];
@@ -326,5 +345,8 @@ extern int ixgbe_setup_tx_resources(struct ixgbe_adapter *, struct ixgbe_ring *)extern void ixgbe_free_rx_resources (struct ixgbe_adapter *,struct ixgbe_ring *);extern void ixgbe_free_tx_resources (struct ixgbe_adapter *,struct ixgbe_ring *);extern void ixgbe_update_stats (struct ixgbe_adapter *adapter); - +extern void ixgbe_reset_interrupt_capability (struct ixgbe_adapter *adapter); +extern int ixgbe_init_interrupt_scheme (struct ixgbe_adapter *adapter); +void ixgbe_napi_add_all (struct ixgbe_adapter *adapter); +void ixgbe_napi_del_all (struct ixgbe_adapter *adapter);#endif /* _IXGBE_H_ */
drivers/net/ixgbe/ixgbe_dcb.c new file +332 -0
332 lines not on this page · raw message
drivers/net/ixgbe/ixgbe_dcb.h new file +158 -0
158 lines not on this page · raw message
drivers/net/ixgbe/ixgbe_dcb_82598.c new file +398 -0
398 lines not on this page · raw message
drivers/net/ixgbe/ixgbe_dcb_82598.h new file +94 -0
94 lines not on this page · raw message
drivers/net/ixgbe/ixgbe_dcb_nl.c new file +352 -0
352 lines not on this page · raw message
drivers/net/ixgbe/ixgbe_ethtool.c +35 -2
@@ -97,9 +97,18 @@ static struct ixgbe_stats ixgbe_gstrings_stats[] = { ((((struct ixgbe_adapter *)netdev->priv)->num_tx_queues + \ ((struct ixgbe_adapter *)netdev->priv)->num_rx_queues) * \ (sizeof(struct ixgbe_queue_stats) / sizeof(u64))) -#define IXGBE_STATS_LEN (IXGBE_GLOBAL_STATS_LEN + IXGBE_QUEUE_STATS_LEN)#define IXGBE_GLOBAL_STATS_LEN ARRAY_SIZE(ixgbe_gstrings_stats) -#define IXGBE_STATS_LEN (IXGBE_GLOBAL_STATS_LEN + IXGBE_QUEUE_STATS_LEN) +#define IXGBE_PB_STATS_LEN ( \ + (((struct ixgbe_adapter *)netdev->priv)->flags & \ + IXGBE_FLAG_DCB_ENABLED) ? \ + (sizeof(((struct ixgbe_adapter *)0)->stats.pxonrxc) + \ + sizeof(((struct ixgbe_adapter *)0)->stats.pxontxc) + \ + sizeof(((struct ixgbe_adapter *)0)->stats.pxoffrxc) + \ + sizeof(((struct ixgbe_adapter *)0)->stats.pxofftxc)) \ + / sizeof(u64) : 0) +#define IXGBE_STATS_LEN (IXGBE_GLOBAL_STATS_LEN + \ + IXGBE_PB_STATS_LEN + \ + IXGBE_QUEUE_STATS_LEN)static int ixgbe_get_settings (struct net_device *netdev,struct ethtool_cmd *ecmd)
@@ -804,6 +813,16 @@ static void ixgbe_get_ethtool_stats(struct net_device *netdev, data[i + k] = queue_stat[k]; i += k; } +if (adapter->flags &IXGBE_FLAG_DCB_ENABLED ) { +for (j =0 ; j <MAX_TX_PACKET_BUFFERS ; j++) { + data[i++] = adapter->stats.pxontxc[j]; + data[i++] = adapter->stats.pxofftxc[j]; + } +for (j =0 ; j <MAX_RX_PACKET_BUFFERS ; j++) { + data[i++] = adapter->stats.pxonrxc[j]; + data[i++] = adapter->stats.pxoffrxc[j]; + } + } } static void ixgbe_get_strings(struct net_device *netdev, u32 stringset,
@@ -832,6 +851,20 @@ static void ixgbe_get_strings(struct net_device *netdev, u32 stringset,sprintf (p,"rx_queue_%u_bytes" , i); p +=ETH_GSTRING_LEN ; } +if (adapter->flags &IXGBE_FLAG_DCB_ENABLED ) { +for (i =0 ; i <MAX_TX_PACKET_BUFFERS ; i++) { +sprintf (p,"tx_pb_%u_pxon" , i); + p +=ETH_GSTRING_LEN ; +sprintf (p,"tx_pb_%u_pxoff" , i); + p +=ETH_GSTRING_LEN ; + } +for (i =0 ; i <MAX_RX_PACKET_BUFFERS ; i++) { +sprintf (p,"rx_pb_%u_pxon" , i); + p +=ETH_GSTRING_LEN ; +sprintf (p,"rx_pb_%u_pxoff" , i); + p +=ETH_GSTRING_LEN ; + } + }/* BUG_ON(p - data != IXGBE_STATS_LEN * ETH_GSTRING_LEN); */ break ; }
drivers/net/ixgbe/ixgbe_main.c +174 -15
361 lines not on this page · raw message
include/linux/dcbnl.h new file +230 -0
230 lines not on this page · raw message
include/linux/netdevice.h +8 -0
@@ -42,6 +42,9 @@#include <linux/workqueue.h> #include <net/net_namespace.h> +#ifdef CONFIG_DCBNL +#include <net/dcbnl.h> +#endif struct vlan_group ;struct ethtool_ops ;
@@ -751,6 +754,11 @@ struct net_device/* for setting kernel sock attribute on TCP connection setup */ #define GSO_MAX_SIZE 65536unsigned int gso_max_size; + +#ifdef CONFIG_DCBNL +/* Data Center Bridging netlink ops */ +struct dcbnl_rtnl_ops *dcbnl_ops; +#endif };#define to_net_dev (d) container_of(d, struct net_device, dev)
include/linux/rtnetlink.h +5 -0
@@ -107,6 +107,11 @@ enum { RTM_GETADDRLABEL,#define RTM_GETADDRLABEL RTM_GETADDRLABEL + RTM_GETDCB = 78, +#define RTM_GETDCB RTM_GETDCB + RTM_SETDCB, +#define RTM_SETDCB RTM_SETDCB + __RTM_MAX,#define RTM_MAX (((__RTM_MAX + 3) & ~3) - 1) };
include/net/dcbnl.h new file +44 -0
44 lines not on this page · raw message
net/Kconfig +1 -0
@@ -190,6 +190,7 @@ source "net/lapb/Kconfig" source "net/econet/Kconfig" source "net/wanrouter/Kconfig" source "net/sched/Kconfig" +source "net/dcb/Kconfig" menu "Network testing"
net/Makefile +3 -0
@@ -56,6 +56,9 @@ obj-$(CONFIG_NETLABEL) += netlabel/ obj-$(CONFIG_IUCV) += iucv/ obj-$(CONFIG_RFKILL) += rfkill/ obj-$(CONFIG_NET_9P) += 9p/ +ifeq ($(CONFIG_DCBNL),y) +obj-$(CONFIG_DCB) += dcb/ +endif ifeq ($(CONFIG_NET),y) obj-$(CONFIG_SYSCTL) += sysctl_net.o
net/dcb/Kconfig new file +12 -0
@@ -0,0 +1,12 @@ +config DCB + tristate "Data Center Bridging support" + +config DCBNL + bool "Data Center Bridging netlink interface support" + depends on DCB + default n + ---help--- + This option turns on the netlink interface + (dcbnl) for Data Center Bridging capable devices. + + If unsure, say N.
net/dcb/Makefile new file +1 -0
@@ -0,0 +1 @@ +obj-$(CONFIG_DCB) += dcbnl.o
net/dcb/dcbnl.c new file +682 -0
682 lines not on this page · raw message
PATCH 2/6 DCB: Add interface to query for the DCB capabilities of an device.
From: Alexander Duyck <[email protected]>
---
drivers/net/ixgbe/ixgbe_dcb_nl.c | 42 +++++++++++++++++++ include/linux/dcbnl.h | 37 +++++++++++++++++ include/net/dcbnl.h | 1 net/dcb/dcbnl.c | 82 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 161 insertions(+), 1 deletions(-)
drivers/net/ixgbe/ixgbe_dcb_nl.c +41 -1
@@ -333,6 +333,45 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev)return ret; } +static u8 ixgbe_dcbnl_getcap (struct net_device *netdev,int capid,u8 *cap) +{ +struct ixgbe_adapter *adapter =netdev_priv (netdev); +u8 rval =0 ; + +if (adapter->flags &IXGBE_FLAG_DCB_ENABLED ) { +switch (capid) { +case DCB_CAP_ATTR_PG : + *cap = true; +break ; +case DCB_CAP_ATTR_PFC : + *cap = true; +break ; +case DCB_CAP_ATTR_UP2TC : + *cap = false; +break ; +case DCB_CAP_ATTR_PG_TCS : + *cap =0x80 ; +break ; +case DCB_CAP_ATTR_PFC_TCS : + *cap =0x80 ; +break ; +case DCB_CAP_ATTR_GSP : + *cap = true; +break ; +case DCB_CAP_ATTR_BCN : + *cap = false; +break ; +default : + rval = -EINVAL ; +break ; + } + }else { + rval = -EINVAL ; + } + +return rval; +} +struct dcbnl_rtnl_ops dcbnl_ops = { .getstate = ixgbe_dcbnl_get_state, .setstate = ixgbe_dcbnl_set_state,
@@ -347,6 +386,7 @@ struct dcbnl_rtnl_ops dcbnl_ops = { .getpgbwgcfgrx = ixgbe_dcbnl_get_pg_bwg_cfg_rx, .setpfccfg = ixgbe_dcbnl_set_pfc_cfg, .getpfccfg = ixgbe_dcbnl_get_pfc_cfg, - .setall = ixgbe_dcbnl_set_all + .setall = ixgbe_dcbnl_set_all, + .getcap = ixgbe_dcbnl_getcap };
include/linux/dcbnl.h +37 -0
@@ -43,6 +43,7 @@ struct dcbmsg {* @DCB_CMD_SET_ALL: apply all changes to the underlying device * @DCB_CMD_GPERM_HWADDR: get the permanent MAC address of the underlying * device. Only useful when using bonding. +* @DCB_CMD_GCAP: request the DCB capabilities of the device */ enum dcbnl_commands {DCB_CMD_UNDEFINED ,
@@ -60,6 +61,7 @@ enum dcbnl_commands {DCB_CMD_SET_ALL ,DCB_CMD_GPERM_HWADDR , +DCB_CMD_GCAP , __DCB_CMD_ENUM_MAX, DCB_CMD_MAX = __DCB_CMD_ENUM_MAX - 1,
@@ -78,6 +80,7 @@ enum dcbnl_commands {* @DCB_ATTR_PG_CFG: priority group configuration (NLA_NESTED) * @DCB_ATTR_SET_ALL: bool to commit changes to hardware or not (NLA_U8) * @DCB_ATTR_PERM_HWADDR: MAC address of the physical device (NLA_NESTED) +* @DCB_ATTR_CAP: DCB capabilities of the device (NLA_NESTED) */ enum dcbnl_attrs {DCB_ATTR_UNDEFINED ,
@@ -90,6 +93,7 @@ enum dcbnl_attrs {DCB_ATTR_PG_CFG ,DCB_ATTR_SET_ALL ,DCB_ATTR_PERM_HWADDR , +DCB_ATTR_CAP , __DCB_ATTR_ENUM_MAX, DCB_ATTR_MAX = __DCB_ATTR_ENUM_MAX - 1,
@@ -217,6 +221,39 @@ enum dcbnl_tc_attrs { };/** +* enum dcbnl_cap_attrs - DCB Capability attributes +* +* @DCB_CAP_ATTR_UNDEFINED: unspecified attribute to catch errors +* @DCB_CAP_ATTR_ALL: (NLA_FLAG) all capability parameters +* @DCB_CAP_ATTR_PG: (NLA_U8) device supports Priority Groups +* @DCB_CAP_ATTR_PFC: (NLA_U8) device supports Priority Flow Control +* @DCB_CAP_ATTR_UP2TC: (NLA_U8) device supports user priority to +* traffic class mapping +* @DCB_CAP_ATTR_PG_TCS: (NLA_U8) bitmap where each bit represents a +* number of traffic classes the device +* can be configured to use for Priority Groups +* @DCB_CAP_ATTR_PFC_TCS: (NLA_U8) bitmap where each bit represents a +* number of traffic classes the device can be +* configured to use for Priority Flow Control +* @DCB_CAP_ATTR_GSP: (NLA_U8) device supports group strict priority +* @DCB_CAP_ATTR_BCN: (NLA_U8) device supports Backwards Congestion +* Notification +*/ +enum dcbnl_cap_attrs { +DCB_CAP_ATTR_UNDEFINED , +DCB_CAP_ATTR_ALL , +DCB_CAP_ATTR_PG , +DCB_CAP_ATTR_PFC , +DCB_CAP_ATTR_UP2TC , +DCB_CAP_ATTR_PG_TCS , +DCB_CAP_ATTR_PFC_TCS , +DCB_CAP_ATTR_GSP , +DCB_CAP_ATTR_BCN , + + __DCB_CAP_ATTR_ENUM_MAX, +DCB_CAP_ATTR_MAX = __DCB_CAP_ATTR_ENUM_MAX -1 , +}; +/** * enum dcb_general_attr_values - general DCB attribute values * * @DCB_ATTR_UNDEFINED: value used to indicate an attribute is not supported
include/net/dcbnl.h +1 -0
@@ -39,6 +39,7 @@ struct dcbnl_rtnl_ops {void (*setpfccfg)(struct net_device *,int ,u8 );void (*getpfccfg)(struct net_device *,int ,u8 *);u8 (*setall)(struct net_device *); + u8 (*getcap)(struct net_device *, int, u8 *); };#endif /* __NET_DCBNL_H__ */
net/dcb/dcbnl.c +82 -0
106 lines not on this page · raw message
PATCH 3/6 DCB: Add interface to query # of TCs supported by device
In reply to Jeff KirsherFrom: Alexander Duyck <[email protected]>
Adds interface for DCB to query (and set if supported) the number of traffic classes currently supported by the device for the two features:
priority groups and priority flow control.
---
drivers/net/ixgbe/ixgbe_dcb_nl.c | 33 +++++++++ include/linux/dcbnl.h | 27 ++++++++ include/net/dcbnl.h | 2 + net/dcb/dcbnl.c | 136 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 197 insertions(+), 1 deletions(-)
drivers/net/ixgbe/ixgbe_dcb_nl.c +32 -1
@@ -372,6 +372,35 @@ static u8 ixgbe_dcbnl_getcap(struct net_device *netdev, int capid, u8 *cap)return rval; } +static u8 ixgbe_dcbnl_getnumtcs (struct net_device *netdev,int tcid,u8 *num) +{ +struct ixgbe_adapter *adapter =netdev_priv (netdev); +u8 rval =0 ; + +if (adapter->flags &IXGBE_FLAG_DCB_ENABLED ) { +switch (tcid) { +case DCB_NUMTCS_ATTR_PG : + *num =MAX_TRAFFIC_CLASS ; +break ; +case DCB_NUMTCS_ATTR_PFC : + *num =MAX_TRAFFIC_CLASS ; +break ; +default : + rval = -EINVAL ; +break ; + } + }else { + rval = -EINVAL ; + } + +return rval; +} + +static u8 ixgbe_dcbnl_setnumtcs (struct net_device *netdev,int tcid,u8 num) +{ +return -EINVAL ; +} +struct dcbnl_rtnl_ops dcbnl_ops = { .getstate = ixgbe_dcbnl_get_state, .setstate = ixgbe_dcbnl_set_state,
@@ -387,6 +416,8 @@ struct dcbnl_rtnl_ops dcbnl_ops = { .setpfccfg = ixgbe_dcbnl_set_pfc_cfg, .getpfccfg = ixgbe_dcbnl_get_pfc_cfg, .setall = ixgbe_dcbnl_set_all, - .getcap = ixgbe_dcbnl_getcap + .getcap = ixgbe_dcbnl_getcap, + .getnumtcs = ixgbe_dcbnl_getnumtcs, + .setnumtcs = ixgbe_dcbnl_setnumtcs };
include/linux/dcbnl.h +27 -0
@@ -44,6 +44,8 @@ struct dcbmsg {* @DCB_CMD_GPERM_HWADDR: get the permanent MAC address of the underlying * device. Only useful when using bonding. * @DCB_CMD_GCAP: request the DCB capabilities of the device +* @DCB_CMD_GNUMTCS: get the number of traffic classes currently supported +* @DCB_CMD_SNUMTCS: set the number of traffic classes */ enum dcbnl_commands {DCB_CMD_UNDEFINED ,
@@ -62,6 +64,8 @@ enum dcbnl_commands {DCB_CMD_SET_ALL ,DCB_CMD_GPERM_HWADDR ,DCB_CMD_GCAP , +DCB_CMD_GNUMTCS , +DCB_CMD_SNUMTCS , __DCB_CMD_ENUM_MAX, DCB_CMD_MAX = __DCB_CMD_ENUM_MAX - 1,
@@ -81,6 +85,7 @@ enum dcbnl_commands {* @DCB_ATTR_SET_ALL: bool to commit changes to hardware or not (NLA_U8) * @DCB_ATTR_PERM_HWADDR: MAC address of the physical device (NLA_NESTED) * @DCB_ATTR_CAP: DCB capabilities of the device (NLA_NESTED) +* @DCB_ATTR_NUMTCS: number of traffic classes supported (NLA_NESTED) */ enum dcbnl_attrs {DCB_ATTR_UNDEFINED ,
@@ -94,6 +99,7 @@ enum dcbnl_attrs {DCB_ATTR_SET_ALL ,DCB_ATTR_PERM_HWADDR ,DCB_ATTR_CAP , +DCB_ATTR_NUMTCS , __DCB_ATTR_ENUM_MAX, DCB_ATTR_MAX = __DCB_ATTR_ENUM_MAX - 1,
@@ -253,6 +259,27 @@ enum dcbnl_cap_attrs { __DCB_CAP_ATTR_ENUM_MAX, DCB_CAP_ATTR_MAX = __DCB_CAP_ATTR_ENUM_MAX - 1, }; + +/** +* enum dcbnl_numtcs_attrs - number of traffic classes +* +* @DCB_NUMTCS_ATTR_UNDEFINED: unspecified attribute to catch errors +* @DCB_NUMTCS_ATTR_ALL: (NLA_FLAG) all traffic class attributes +* @DCB_NUMTCS_ATTR_PG: (NLA_U8) number of traffic classes used for +* priority groups +* @DCB_NUMTCS_ATTR_PFC: (NLA_U8) number of traffic classes which can +* support priority flow control +*/ +enum dcbnl_numtcs_attrs { +DCB_NUMTCS_ATTR_UNDEFINED , +DCB_NUMTCS_ATTR_ALL , +DCB_NUMTCS_ATTR_PG , +DCB_NUMTCS_ATTR_PFC , + + __DCB_NUMTCS_ATTR_ENUM_MAX, +DCB_NUMTCS_ATTR_MAX = __DCB_NUMTCS_ATTR_ENUM_MAX -1 , +}; +/** * enum dcb_general_attr_values - general DCB attribute values *
include/net/dcbnl.h +2 -0
@@ -40,6 +40,8 @@ struct dcbnl_rtnl_ops {void (*getpfccfg)(struct net_device *,int ,u8 *);u8 (*setall)(struct net_device *);u8 (*getcap)(struct net_device *,int ,u8 *); +u8 (*getnumtcs)(struct net_device *,int ,u8 *); + u8 (*setnumtcs)(struct net_device *, int, u8); };#endif /* __NET_DCBNL_H__ */
net/dcb/dcbnl.c +136 -0
154 lines not on this page · raw message
PATCH 4/6 DCB: Add interface to query the state of PFC feature.
In reply to Jeff KirsherFrom: Alexander Duyck <[email protected]>
Adds a netlink interface for DCB to get and set the state of the PFC feature. Primarily, this is a way to turn off PFC in the driver while DCB remains enabled.
---
drivers/net/ixgbe/ixgbe_dcb_nl.c | 16 +++++++++++++- include/linux/dcbnl.h | 2 ++ include/net/dcbnl.h | 2 ++ net/dcb/dcbnl.c | 43 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 62 insertions(+), 1 deletions(-)
drivers/net/ixgbe/ixgbe_dcb_nl.c +15 -1
@@ -401,6 +401,18 @@ static u8 ixgbe_dcbnl_setnumtcs(struct net_device *netdev, int tcid, u8 num)return -EINVAL ; } +static u8 ixgbe_dcbnl_getpfcstate (struct net_device *netdev) +{ +struct ixgbe_adapter *adapter =netdev_priv (netdev); + +return !!(adapter->flags &IXGBE_FLAG_DCB_ENABLED ); +} + +static void ixgbe_dcbnl_setpfcstate (struct net_device *netdev,u8 state) +{ +return ; +} +struct dcbnl_rtnl_ops dcbnl_ops = { .getstate = ixgbe_dcbnl_get_state, .setstate = ixgbe_dcbnl_set_state,
@@ -418,6 +430,8 @@ struct dcbnl_rtnl_ops dcbnl_ops = { .setall = ixgbe_dcbnl_set_all, .getcap = ixgbe_dcbnl_getcap, .getnumtcs = ixgbe_dcbnl_getnumtcs, - .setnumtcs = ixgbe_dcbnl_setnumtcs + .setnumtcs = ixgbe_dcbnl_setnumtcs, + .getpfcstate = ixgbe_dcbnl_getpfcstate, + .setpfcstate = ixgbe_dcbnl_setpfcstate };
include/linux/dcbnl.h +2 -0
@@ -66,6 +66,8 @@ enum dcbnl_commands {DCB_CMD_GCAP ,DCB_CMD_GNUMTCS ,DCB_CMD_SNUMTCS , +DCB_CMD_PFC_GSTATE , +DCB_CMD_PFC_SSTATE , __DCB_CMD_ENUM_MAX, DCB_CMD_MAX = __DCB_CMD_ENUM_MAX - 1,
include/net/dcbnl.h +2 -0
@@ -42,6 +42,8 @@ struct dcbnl_rtnl_ops {u8 (*getcap)(struct net_device *,int ,u8 *);u8 (*getnumtcs)(struct net_device *,int ,u8 *);u8 (*setnumtcs)(struct net_device *,int ,u8 ); +u8 (*getpfcstate)(struct net_device *); + void (*setpfcstate)(struct net_device *, u8); };#endif /* __NET_DCBNL_H__ */
net/dcb/dcbnl.c +43 -0
61 lines not on this page · raw message
PATCH 5/6 DCB: Add support for DCB BCN
In reply to Jeff KirsherFrom: Alexander Duyck <[email protected]>
---
drivers/net/ixgbe/ixgbe_dcb.h | 28 ++++++ drivers/net/ixgbe/ixgbe_dcb_nl.c | 176 ++++++++++++++++++++++++++++++++++++++ include/linux/dcbnl.h | 44 +++++++++- include/net/dcbnl.h | 4 + net/dcb/dcbnl.c | 174 ++++++++++++++++++++++++++++++++++++-- 5 files changed, 416 insertions(+), 10 deletions(-)
drivers/net/ixgbe/ixgbe_dcb.h +27 -1
@@ -108,7 +108,34 @@ enum dcb_rx_pba_cfg {pba_80_48 /* PBA[0-3] each use 80KB, PBA[4-7] each use 48KB */ }; +/* +* This structure contains many values encoded as fixed-point +* numbers, meaning that some of bits are dedicated to the +* magnitude and others to the fraction part. In the comments +* this is shown as f=n, where n is the number of fraction bits. +* These fraction bits are always the low-order bits. The size +* of the magnitude is not specified. +*/ +struct bcn_config { +u32 rp_admin_mode[MAX_TRAFFIC_CLASS ];/* BCN enabled, per TC */ +u32 bcna_option[2 ];/* BCNA Port + MAC Addr */ +u32 rp_w;/* Derivative Weight, f=3 */ +u32 rp_gi;/* Increase Gain, f=12 */ +u32 rp_gd;/* Decrease Gain, f=12 */ +u32 rp_ru;/* Rate Unit */ +u32 rp_alpha;/* Max Decrease Factor, f=12 */ +u32 rp_beta;/* Max Increase Factor, f=12 */ +u32 rp_ri;/* Initial Rate */ +u32 rp_td;/* Drift Interval Timer */ +u32 rp_rd;/* Drift Increase */ +u32 rp_tmax;/* Severe Congestion Backoff Timer Range */ +u32 rp_rmin;/* Severe Congestion Restart Rate */ +u32 rp_wrtt;/* RTT Moving Average Weight */ +}; +struct ixgbe_dcb_config { +struct bcn_config bcn; +struct tc_configuration tc_config[MAX_TRAFFIC_CLASS ];u8 bw_percentage[2 ][MAX_BW_GROUP ];/* One each for Tx/Rx */
@@ -120,7 +147,6 @@ struct ixgbe_dcb_config {u32 link_speed;/* For bandwidth allocation validation purpose */ }; -/* DCB driver APIs */ /* DCB rule checking function.*/
drivers/net/ixgbe/ixgbe_dcb_nl.c +175 -1
205 lines not on this page · raw message
include/linux/dcbnl.h +43 -1
85 lines not on this page · raw message
include/net/dcbnl.h +4 -0
@@ -44,6 +44,10 @@ struct dcbnl_rtnl_ops {u8 (*setnumtcs)(struct net_device *,int ,u8 );u8 (*getpfcstate)(struct net_device *);void (*setpfcstate)(struct net_device *,u8 ); +void (*getbcncfg)(struct net_device *,int ,u32 *); +void (*setbcncfg)(struct net_device *,int ,u32 ); +void (*getbcnrp)(struct net_device *,int ,u8 *); + void (*setbcnrp)(struct net_device *, int, u8); };#endif /* __NET_DCBNL_H__ */
net/dcb/dcbnl.c +167 -7
205 lines not on this page · raw message
PATCH 6/6 DCB: setting pg will cause tx unit hangs
In reply to Jeff KirsherFrom: Alexander Duyck <[email protected]>
It seems like the configuration may be doing things while the adapter is still up that it shouldn't.
---
drivers/net/ixgbe/ixgbe_dcb_nl.c | 16 ++++++++++------ 1 files changed, 10 insertions(+), 6 deletions(-)
drivers/net/ixgbe/ixgbe_dcb_nl.c +10 -6
@@ -135,7 +135,7 @@ static void ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state)if (adapter->flags &IXGBE_FLAG_DCB_ENABLED ) {return ; }else { -if (netdev->flags &IFF_UP ) +if (netif_running (netdev)) netdev->stop (netdev);ixgbe_reset_interrupt_capability (adapter);ixgbe_napi_del_all (adapter);
@@ -149,13 +149,13 @@ static void ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state) adapter->flags |=IXGBE_FLAG_DCB_ENABLED ;ixgbe_init_interrupt_scheme (adapter);ixgbe_napi_add_all (adapter); -if (netdev->flags &IFF_UP ) +if (netif_running (netdev)) netdev->open (netdev); } }else {/* Turn off DCB */ if (adapter->flags &IXGBE_FLAG_DCB_ENABLED ) { -if (netdev->flags &IFF_UP ) +if (netif_running (netdev)) netdev->stop (netdev);ixgbe_reset_interrupt_capability (adapter);ixgbe_napi_del_all (adapter);
@@ -169,7 +169,7 @@ static void ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state) adapter->flags |=IXGBE_FLAG_RSS_ENABLED ;ixgbe_init_interrupt_scheme (adapter);ixgbe_napi_add_all (adapter); -if (netdev->flags &IFF_UP ) +if (netif_running (netdev)) netdev->open (netdev); }else {return ;
@@ -338,6 +338,9 @@ 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); + ret =ixgbe_copy_dcb_cfg (&adapter->temp_dcb_cfg, &adapter->dcb_cfg, adapter->ring_feature[RING_F_DCB ].indices);if (ret) {
@@ -345,8 +348,9 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev)return ret; } -ixgbe_down (adapter); -ixgbe_up (adapter); +if (netif_running (netdev)) +ixgbe_up (adapter); + adapter->dcb_set_bitmap =0x00 ;clear_bit (__IXGBE_RESETTING, &adapter->state);return ret;
Quoted 27 lines · Jeff Kirsher
From: Alexander Duyck <[email protected]>
Signed-off-by Alexander Duyck <[email protected]>Signed-off-by Jeff Kirsher <[email protected]>---
drivers/net/ixgbe/Makefile | 3 drivers/net/ixgbe/ixgbe.h | 26 + drivers/net/ixgbe/ixgbe_dcb.c | 332 +++++++++++++++++ drivers/net/ixgbe/ixgbe_dcb.h | 158 ++++++++ drivers/net/ixgbe/ixgbe_dcb_82598.c | 398 ++++++++++++++++++++ drivers/net/ixgbe/ixgbe_dcb_82598.h | 94 +++++ drivers/net/ixgbe/ixgbe_dcb_nl.c | 352 ++++++++++++++++++ drivers/net/ixgbe/ixgbe_ethtool.c | 37 ++ drivers/net/ixgbe/ixgbe_main.c | 189 +++++++++- include/linux/dcbnl.h | 230 ++++++++++++ include/linux/netdevice.h | 8 include/linux/rtnetlink.h | 5 include/net/dcbnl.h | 44 ++ net/Kconfig | 1 net/Makefile | 3 net/dcb/Kconfig | 12 + net/dcb/Makefile | 1 net/dcb/dcbnl.c | 682 +++++++++++++++++++++++++++++++++++ 18 files changed, 2555 insertions(+), 20 deletions(-) create mode 100644 drivers/net/ixgbe/ixgbe_dcb.c create mode 100644 drivers/net/ixgbe/ixgbe_dcb.h
Quoted 9 lines
create mode 100644 drivers/net/ixgbe/ixgbe_dcb_82598.c create mode 100644 drivers/net/ixgbe/ixgbe_dcb_82598.h create mode 100644 drivers/net/ixgbe/ixgbe_dcb_nl.c create mode 100644 include/linux/dcbnl.h create mode 100644 include/net/dcbnl.h create mode 100644 net/dcb/Kconfig create mode 100644 net/dcb/Makefile create mode 100644 net/dcb/dcbnl.c
Sorry I got PJ's email incorrect the first time, resent with PJ's correct email.
Signature · 2 lines
Cheers, Jeff