cxgb3 - Add LRO support
Subsystems (2)
PATCH RESEND 3/3 cxgb3 - Add LRO support
From: Divy Le Ray <[email protected]>
Add LRO support.
Signed-off-by Divy Le Ray <[email protected]>
---
drivers/net/Kconfig | 1 drivers/net/cxgb3/adapter.h | 14 ++ drivers/net/cxgb3/common.h | 1 drivers/net/cxgb3/cxgb3_ioctl.h | 1 drivers/net/cxgb3/cxgb3_main.c | 19 +++ drivers/net/cxgb3/sge.c | 233 +++++++++++++++++++++++++++++++++++++-- drivers/net/cxgb3/t3_cpl.h | 11 ++ 7 files changed, 268 insertions(+), 12 deletions(-)
drivers/net/Kconfig +1 -0
@@ -2409,6 +2409,7 @@ config CHELSIO_T3 tristate "Chelsio Communications T3 10Gb Ethernet support" depends on PCI select FW_LOADER + select INET_LRO help This driver supports Chelsio T3-based gigabit and 10Gb Ethernet adapters.
drivers/net/cxgb3/adapter.h +14 -0
@@ -42,6 +42,7 @@#include <linux/cache.h> #include <linux/mutex.h> #include <linux/bitops.h> +#include <linux/inet_lro.h> #include "t3cdev.h" #include <asm/io.h>
@@ -173,16 +174,29 @@ enum { /* per port SGE statistics */SGE_PSTAT_TX_CSUM ,/* # of TX checksum offloads */ SGE_PSTAT_VLANEX ,/* # of VLAN tag extractions */ SGE_PSTAT_VLANINS ,/* # of VLAN tag insertions */ +SGE_PSTAT_LRO_AGGR ,/* # of page chunks added to LRO sessions */ +SGE_PSTAT_LRO_FLUSHED ,/* # of flushed LRO sessions */ +SGE_PSTAT_LRO_NO_DESC ,/* # of overflown LRO sessions */ SGE_PSTAT_MAX /* must be last */ }; +#define T3_MAX_LRO_SES 8 +#define T3_MAX_LRO_MAX_PKTS 64 +struct sge_qset {/* an SGE queue set */ struct adapter *adap;struct napi_struct napi;struct sge_rspq rspq;struct sge_fl fl[SGE_RXQ_PER_SET ];struct sge_txq txq[SGE_TXQ_PER_SET ]; +struct net_lro_mgr lro_mgr; +struct net_lro_desc lro_desc[T3_MAX_LRO_SES ]; +struct skb_frag_struct *lro_frag_tbl; +int lro_nfrags; +int lro_enabled; +int lro_frag_len; +void *lro_va;struct net_device *netdev;unsigned long txq_stopped;/* which Tx queues are stopped */ struct timer_list tx_reclaim_timer;/* reclaims TX buffers */
drivers/net/cxgb3/common.h +1 -0
@@ -351,6 +351,7 @@ struct tp_params {struct qset_params {/* SGE queue set parameters */ unsigned int polling;/* polling/interrupt service for rspq */ +unsigned int lro;/* large receive offload */ unsigned int coalesce_usecs;/* irq coalescing timer */ unsigned int rspq_size;/* # of entries in response queue */ unsigned int fl_size;/* # of entries in regular free list */
drivers/net/cxgb3/cxgb3_ioctl.h +1 -0
@@ -90,6 +90,7 @@ struct ch_qset_params {int32_t fl_size[2 ];int32_t intr_lat;int32_t polling; +int32_t lro;int32_t cong_thres; };
drivers/net/cxgb3/cxgb3_main.c +19 -0
@@ -1212,6 +1212,9 @@ static char stats_strings[][ETH_GSTRING_LEN] = {"VLANinsertions " ,"TxCsumOffload " ,"RxCsumGood " , +"LroAggregated " , +"LroFlushed " , +"LroNoDesc " ,"RxDrops " , "CheckTXEnToggled ",
@@ -1340,6 +1343,9 @@ static void get_stats(struct net_device *dev, struct ethtool_stats *stats, *data++ =collect_sge_port_stats (adapter, pi,SGE_PSTAT_VLANINS ); *data++ =collect_sge_port_stats (adapter, pi,SGE_PSTAT_TX_CSUM ); *data++ =collect_sge_port_stats (adapter, pi,SGE_PSTAT_RX_CSUM_GOOD ); + *data++ =collect_sge_port_stats (adapter, pi,SGE_PSTAT_LRO_AGGR ); + *data++ =collect_sge_port_stats (adapter, pi,SGE_PSTAT_LRO_FLUSHED ); + *data++ =collect_sge_port_stats (adapter, pi,SGE_PSTAT_LRO_NO_DESC ); *data++ = s->rx_cong_drops; *data++ = s->num_toggled;
@@ -1558,6 +1564,13 @@ static int set_rx_csum(struct net_device *dev, u32 data)struct port_info *p =netdev_priv (dev); p->rx_csum_offload = data; +if (!data) { +struct adapter *adap = p->adapter; +int i; + +for (i = p->first_qset; i < p->first_qset + p->nqsets; i++) + adap->sge.qs[i].lro_enabled =0 ; + }return 0 ; }
@@ -1830,6 +1843,11 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr) } } } +if (t.lro >=0 ) { +struct sge_qset *qs = &adapter->sge.qs[t.qset_idx]; + q->lro = t.lro; + qs->lro_enabled = t.lro; + }break ; }case CHELSIO_GET_QSET_PARAMS :{
@@ -1849,6 +1867,7 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr) t.fl_size[0 ] = q->fl_size; t.fl_size[1 ] = q->jumbo_size; t.polling = q->polling; + t.lro = q->lro; t.intr_lat = q->coalesce_usecs; t.cong_thres = q->cong_thres;
drivers/net/cxgb3/sge.c +221 -12
324 lines not on this page · raw message
drivers/net/cxgb3/t3_cpl.h +11 -0
@@ -174,6 +174,13 @@ enum { /* TCP congestion control algorithms */CONG_ALG_HIGHSPEED }; +enum {/* RSS hash type */ +RSS_HASH_NONE =0 , +RSS_HASH_2_TUPLE =1 , +RSS_HASH_4_TUPLE =2 , +RSS_HASH_TCPV6 =3 +}; +union opcode_tid {__be32 opcode_tid;__u8 opcode;
@@ -184,6 +191,10 @@ union opcode_tid {#define G_OPCODE (x) (((x) >> S_OPCODE) & 0xFF)#define G_TID (x) ((x) & 0xFFFFFF) +#define S_HASHTYPE 22 +#define M_HASHTYPE 0x3 +#define G_HASHTYPE (x) (((x) >> S_HASHTYPE) & M_HASHTYPE) +/* tid is assumed to be 24-bits */ #define MK_OPCODE_TID (opcode, tid) (V_OPCODE(opcode) | (tid))