aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/netxen/netxen_nic.h
diff options
context:
space:
mode:
authorDhananjay Phadke <dhananjay@netxen.com>2009-03-13 10:52:05 -0400
committerDavid S. Miller <davem@davemloft.net>2009-03-14 17:00:33 -0400
commitd8b100c5da003b6f8c410453e1e6e74ced8d1cc1 (patch)
tree75d895254bb70859ef5c3b4cab2d5da313af8e87 /drivers/net/netxen/netxen_nic.h
parent9b3ef55c6ddbe8c7b76707eae9a77d874fe2cec0 (diff)
netxen: add receive side scaling (rss) support
This patch enables the load balancing capability of firmware and hardware to spray traffic into different cpus through separate rx msix interrupts. The feature is being enabled for NX3031, NX2031 (old) will be enabled later. This depends on msi-x and compatibility with msi and legacy is maintained by enabling single rx ring. Signed-off-by: Dhananjay Phadke <dhananjay@netxen.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/netxen/netxen_nic.h')
-rw-r--r--drivers/net/netxen/netxen_nic.h74
1 files changed, 47 insertions, 27 deletions
diff --git a/drivers/net/netxen/netxen_nic.h b/drivers/net/netxen/netxen_nic.h
index 56fad22fed9a..595171d943fa 100644
--- a/drivers/net/netxen/netxen_nic.h
+++ b/drivers/net/netxen/netxen_nic.h
@@ -78,16 +78,17 @@
78 78
79#define PHAN_VENDOR_ID 0x4040 79#define PHAN_VENDOR_ID 0x4040
80 80
81#define RCV_DESC_RINGSIZE \ 81#define RCV_DESC_RINGSIZE(rds_ring) \
82 (sizeof(struct rcv_desc) * adapter->num_rxd) 82 (sizeof(struct rcv_desc) * (rds_ring)->num_desc)
83#define STATUS_DESC_RINGSIZE \ 83#define RCV_BUFF_RINGSIZE(rds_ring) \
84 (sizeof(struct status_desc) * adapter->num_rxd)
85#define LRO_DESC_RINGSIZE \
86 (sizeof(rcvDesc_t) * adapter->num_lro_rxd)
87#define TX_RINGSIZE \
88 (sizeof(struct netxen_cmd_buffer) * adapter->num_txd)
89#define RCV_BUFFSIZE \
90 (sizeof(struct netxen_rx_buffer) * rds_ring->num_desc) 84 (sizeof(struct netxen_rx_buffer) * rds_ring->num_desc)
85#define STATUS_DESC_RINGSIZE(sds_ring) \
86 (sizeof(struct status_desc) * (sds_ring)->num_desc)
87#define TX_BUFF_RINGSIZE(adapter) \
88 (sizeof(struct netxen_cmd_buffer) * adapter->num_txd)
89#define TX_DESC_RINGSIZE(adapter) \
90 (sizeof(struct cmd_desc_type0) * adapter->num_txd)
91
91#define find_diff_among(a,b,range) ((a)<(b)?((b)-(a)):((b)+(range)-(a))) 92#define find_diff_among(a,b,range) ((a)<(b)?((b)-(a)):((b)+(range)-(a)))
92 93
93#define NETXEN_RCV_PRODUCER_OFFSET 0 94#define NETXEN_RCV_PRODUCER_OFFSET 0
@@ -188,7 +189,8 @@
188/* Host writes the following to notify that it has done the init-handshake */ 189/* Host writes the following to notify that it has done the init-handshake */
189#define PHAN_INITIALIZE_ACK 0xf00f 190#define PHAN_INITIALIZE_ACK 0xf00f
190 191
191#define NUM_RCV_DESC_RINGS 3 /* No of Rcv Descriptor contexts */ 192#define NUM_RCV_DESC_RINGS 3
193#define NUM_STS_DESC_RINGS 4
192 194
193#define RCV_RING_NORMAL 0 195#define RCV_RING_NORMAL 0
194#define RCV_RING_JUMBO 1 196#define RCV_RING_JUMBO 1
@@ -722,7 +724,7 @@ extern char netxen_nic_driver_name[];
722#endif 724#endif
723 725
724/* Number of status descriptors to handle per interrupt */ 726/* Number of status descriptors to handle per interrupt */
725#define MAX_STATUS_HANDLE (128) 727#define MAX_STATUS_HANDLE (64)
726 728
727/* 729/*
728 * netxen_skb_frag{} is to contain mapping info for each SG list. This 730 * netxen_skb_frag{} is to contain mapping info for each SG list. This
@@ -827,17 +829,37 @@ struct netxen_adapter_stats {
827 */ 829 */
828struct nx_host_rds_ring { 830struct nx_host_rds_ring {
829 u32 producer; 831 u32 producer;
830 u32 crb_rcv_producer; /* reg offset */ 832 u32 crb_rcv_producer;
831 struct rcv_desc *desc_head; /* address of rx ring in Phantom */
832 struct netxen_rx_buffer *rx_buf_arr; /* rx buffers for receive */
833 struct list_head free_list;
834 u32 num_desc; 833 u32 num_desc;
835 u32 dma_size; 834 u32 dma_size;
836 u32 skb_size; 835 u32 skb_size;
837 u32 flags; 836 u32 flags;
837 struct rcv_desc *desc_head;
838 struct netxen_rx_buffer *rx_buf_arr;
839 struct list_head free_list;
840 spinlock_t lock;
838 dma_addr_t phys_addr; 841 dma_addr_t phys_addr;
839}; 842};
840 843
844struct nx_host_sds_ring {
845 u32 consumer;
846 u32 crb_sts_consumer;
847 u32 crb_intr_mask;
848 u32 num_desc;
849
850 struct status_desc *desc_head;
851 struct netxen_adapter *adapter;
852 struct napi_struct napi;
853 struct list_head free_list[NUM_RCV_DESC_RINGS];
854
855 u16 clean_tx;
856 u16 post_rxd;
857 int irq;
858
859 dma_addr_t phys_addr;
860 char name[IFNAMSIZ+4];
861};
862
841/* 863/*
842 * Receive context. There is one such structure per instance of the 864 * Receive context. There is one such structure per instance of the
843 * receive processing. Any state information that is relevant to 865 * receive processing. Any state information that is relevant to
@@ -850,10 +872,7 @@ struct netxen_recv_context {
850 u16 virt_port; 872 u16 virt_port;
851 873
852 struct nx_host_rds_ring rds_rings[NUM_RCV_DESC_RINGS]; 874 struct nx_host_rds_ring rds_rings[NUM_RCV_DESC_RINGS];
853 u32 status_rx_consumer; 875 struct nx_host_sds_ring sds_rings[NUM_STS_DESC_RINGS];
854 u32 crb_sts_consumer; /* reg offset */
855 dma_addr_t rcv_status_desc_phys_addr;
856 struct status_desc *rcv_status_desc_head;
857}; 876};
858 877
859/* New HW context creation */ 878/* New HW context creation */
@@ -1179,13 +1198,13 @@ typedef struct {
1179#define NETXEN_IS_MSI_FAMILY(adapter) \ 1198#define NETXEN_IS_MSI_FAMILY(adapter) \
1180 ((adapter)->flags & (NETXEN_NIC_MSI_ENABLED | NETXEN_NIC_MSIX_ENABLED)) 1199 ((adapter)->flags & (NETXEN_NIC_MSI_ENABLED | NETXEN_NIC_MSIX_ENABLED))
1181 1200
1182#define MSIX_ENTRIES_PER_ADAPTER 1 1201#define MSIX_ENTRIES_PER_ADAPTER NUM_STS_DESC_RINGS
1183#define NETXEN_MSIX_TBL_SPACE 8192 1202#define NETXEN_MSIX_TBL_SPACE 8192
1184#define NETXEN_PCI_REG_MSIX_TBL 0x44 1203#define NETXEN_PCI_REG_MSIX_TBL 0x44
1185 1204
1186#define NETXEN_DB_MAPSIZE_BYTES 0x1000 1205#define NETXEN_DB_MAPSIZE_BYTES 0x1000
1187 1206
1188#define NETXEN_NETDEV_WEIGHT 120 1207#define NETXEN_NETDEV_WEIGHT 128
1189#define NETXEN_ADAPTER_UP_MAGIC 777 1208#define NETXEN_ADAPTER_UP_MAGIC 777
1190#define NETXEN_NIC_PEG_TUNE 0 1209#define NETXEN_NIC_PEG_TUNE 0
1191 1210
@@ -1200,7 +1219,6 @@ struct netxen_adapter {
1200 struct net_device *netdev; 1219 struct net_device *netdev;
1201 struct pci_dev *pdev; 1220 struct pci_dev *pdev;
1202 int pci_using_dac; 1221 int pci_using_dac;
1203 struct napi_struct napi;
1204 struct net_device_stats net_stats; 1222 struct net_device_stats net_stats;
1205 int mtu; 1223 int mtu;
1206 int portnum; 1224 int portnum;
@@ -1212,7 +1230,6 @@ struct netxen_adapter {
1212 nx_mac_list_t *mac_list; 1230 nx_mac_list_t *mac_list;
1213 1231
1214 struct netxen_legacy_intr_set legacy_intr; 1232 struct netxen_legacy_intr_set legacy_intr;
1215 u32 crb_intr_mask;
1216 1233
1217 struct work_struct watchdog_task; 1234 struct work_struct watchdog_task;
1218 struct timer_list watchdog_timer; 1235 struct timer_list watchdog_timer;
@@ -1227,6 +1244,7 @@ struct netxen_adapter {
1227 u32 last_cmd_consumer; 1244 u32 last_cmd_consumer;
1228 u32 crb_addr_cmd_producer; 1245 u32 crb_addr_cmd_producer;
1229 u32 crb_addr_cmd_consumer; 1246 u32 crb_addr_cmd_consumer;
1247 spinlock_t tx_clean_lock;
1230 1248
1231 u32 num_txd; 1249 u32 num_txd;
1232 u32 num_rxd; 1250 u32 num_rxd;
@@ -1234,6 +1252,7 @@ struct netxen_adapter {
1234 u32 num_lro_rxd; 1252 u32 num_lro_rxd;
1235 1253
1236 int max_rds_rings; 1254 int max_rds_rings;
1255 int max_sds_rings;
1237 1256
1238 u32 flags; 1257 u32 flags;
1239 u32 irq; 1258 u32 irq;
@@ -1243,8 +1262,7 @@ struct netxen_adapter {
1243 u32 fw_major; 1262 u32 fw_major;
1244 u32 fw_version; 1263 u32 fw_version;
1245 1264
1246 u8 msix_supported; 1265 int msix_supported;
1247 u8 max_possible_rss_rings;
1248 struct msix_entry msix_entries[MSIX_ENTRIES_PER_ADAPTER]; 1266 struct msix_entry msix_entries[MSIX_ENTRIES_PER_ADAPTER];
1249 1267
1250 struct netxen_adapter_stats stats; 1268 struct netxen_adapter_stats stats;
@@ -1447,14 +1465,16 @@ void netxen_initialize_adapter_ops(struct netxen_adapter *adapter);
1447int netxen_init_firmware(struct netxen_adapter *adapter); 1465int netxen_init_firmware(struct netxen_adapter *adapter);
1448void netxen_nic_clear_stats(struct netxen_adapter *adapter); 1466void netxen_nic_clear_stats(struct netxen_adapter *adapter);
1449void netxen_watchdog_task(struct work_struct *work); 1467void netxen_watchdog_task(struct work_struct *work);
1450void netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ringid); 1468void netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ringid,
1469 struct nx_host_rds_ring *rds_ring);
1451int netxen_process_cmd_ring(struct netxen_adapter *adapter); 1470int netxen_process_cmd_ring(struct netxen_adapter *adapter);
1452int netxen_process_rcv_ring(struct netxen_adapter *adapter, int max); 1471int netxen_process_rcv_ring(struct nx_host_sds_ring *sds_ring, int max);
1453void netxen_p2_nic_set_multi(struct net_device *netdev); 1472void netxen_p2_nic_set_multi(struct net_device *netdev);
1454void netxen_p3_nic_set_multi(struct net_device *netdev); 1473void netxen_p3_nic_set_multi(struct net_device *netdev);
1455void netxen_p3_free_mac_list(struct netxen_adapter *adapter); 1474void netxen_p3_free_mac_list(struct netxen_adapter *adapter);
1456int netxen_p3_nic_set_promisc(struct netxen_adapter *adapter, u32); 1475int netxen_p3_nic_set_promisc(struct netxen_adapter *adapter, u32);
1457int netxen_config_intr_coalesce(struct netxen_adapter *adapter); 1476int netxen_config_intr_coalesce(struct netxen_adapter *adapter);
1477int netxen_config_rss(struct netxen_adapter *adapter, int enable);
1458 1478
1459int nx_fw_cmd_set_mtu(struct netxen_adapter *adapter, int mtu); 1479int nx_fw_cmd_set_mtu(struct netxen_adapter *adapter, int mtu);
1460int netxen_nic_change_mtu(struct net_device *netdev, int new_mtu); 1480int netxen_nic_change_mtu(struct net_device *netdev, int new_mtu);