11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*******************************************************************************
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
30abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok  Intel PRO/1000 Linux driver
40abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok  Copyright(c) 1999 - 2006 Intel Corporation.
50abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok
60abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok  This program is free software; you can redistribute it and/or modify it
70abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok  under the terms and conditions of the GNU General Public License,
80abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok  version 2, as published by the Free Software Foundation.
90abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok
100abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok  This program is distributed in the hope it will be useful, but WITHOUT
110abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
120abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  more details.
140abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  You should have received a copy of the GNU General Public License along with
160abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok  this program; if not, write to the Free Software Foundation, Inc.,
170abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
180abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok
190abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok  The full GNU General Public License is included in this distribution in
200abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok  the file called "COPYING".
210abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  Contact Information:
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  Linux NICS <linux.nics@intel.com>
243d41e30aa3dde76c81ecbbf0e3a25392fcd90469Auke Kok  e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds*******************************************************************************/
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Linux PRO/1000 Ethernet Driver main header file */
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef _E1000_H_
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _E1000_H_
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/stddef.h>
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h>
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/types.h>
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/byteorder.h>
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h>
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/mm.h>
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/errno.h>
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/ioport.h>
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/pci.h>
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/kernel.h>
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/netdevice.h>
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/etherdevice.h>
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/skbuff.h>
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/delay.h>
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/timer.h>
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/slab.h>
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/vmalloc.h>
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/interrupt.h>
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/string.h>
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/pagemap.h>
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/dma-mapping.h>
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/bitops.h>
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/io.h>
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/irq.h>
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/capability.h>
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/in.h>
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/ip.h>
6287ca4e5b8d729fc157a0a599d78ccab245fc0602Auke Kok#include <linux/ipv6.h>
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/tcp.h>
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/udp.h>
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <net/pkt_sched.h>
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/list.h>
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/reboot.h>
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <net/checksum.h>
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/mii.h>
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/ethtool.h>
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/if_vlan.h>
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BAR_0		0
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BAR_1		1
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BAR_5		5
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INTEL_E1000_ETHERNET_DEVICE(device_id) {\
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	PCI_DEVICE(PCI_VENDOR_ID_INTEL, device_id)}
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct e1000_adapter;
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "e1000_hw.h"
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define E1000_MAX_INTR 10
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* TX/RX descriptor defines */
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define E1000_DEFAULT_TXD                  256
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define E1000_MAX_TXD                      256
89b59544649d6bb5134ab56764836efc29241ae5e0Alexander Duyck#define E1000_MIN_TXD                       48
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define E1000_MAX_82544_TXD               4096
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define E1000_DEFAULT_RXD                  256
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define E1000_MAX_RXD                      256
94b59544649d6bb5134ab56764836efc29241ae5e0Alexander Duyck#define E1000_MIN_RXD                       48
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define E1000_MAX_82544_RXD               4096
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9794c9e5a89349a1f1ebabe0876c059dc387b8b2a0Jesse Brandeburg#define E1000_MIN_ITR_USECS		10 /* 100000 irq/sec */
9894c9e5a89349a1f1ebabe0876c059dc387b8b2a0Jesse Brandeburg#define E1000_MAX_ITR_USECS		10000 /* 100    irq/sec */
9994c9e5a89349a1f1ebabe0876c059dc387b8b2a0Jesse Brandeburg
100eb0f8054dd2e8b3cdf3af4771583b1dc2e1327ccAuke Kok/* this is the size past which hardware will drop packets when setting LPE=0 */
101eb0f8054dd2e8b3cdf3af4771583b1dc2e1327ccAuke Kok#define MAXIMUM_ETHERNET_VLAN_SIZE 1522
102eb0f8054dd2e8b3cdf3af4771583b1dc2e1327ccAuke Kok
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Supported Rx Buffer Sizes */
1042d7edb923a823660b081bd4c660300ee19adca8dMalli Chilakala#define E1000_RXBUFFER_128   128    /* Used for packet split */
1052d7edb923a823660b081bd4c660300ee19adca8dMalli Chilakala#define E1000_RXBUFFER_256   256    /* Used for packet split */
1069e2feace1acd38d7a3b1275f7f9f8a397d09040eAuke Kok#define E1000_RXBUFFER_512   512
1079e2feace1acd38d7a3b1275f7f9f8a397d09040eAuke Kok#define E1000_RXBUFFER_1024  1024
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define E1000_RXBUFFER_2048  2048
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define E1000_RXBUFFER_4096  4096
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define E1000_RXBUFFER_8192  8192
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define E1000_RXBUFFER_16384 16384
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* SmartSpeed delimiters */
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define E1000_SMARTSPEED_DOWNSHIFT 3
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define E1000_SMARTSPEED_MAX       15
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Packet Buffer allocations */
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define E1000_PBA_BYTES_SHIFT 0xA
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define E1000_TX_HEAD_ADDR_SHIFT 7
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define E1000_PBA_TX_MASK 0xFFFF0000
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Flow Control Watermarks */
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define E1000_FC_HIGH_DIFF 0x1638  /* High: 5688 bytes below Rx FIFO size */
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define E1000_FC_LOW_DIFF 0x1640   /* Low:  5696 bytes below Rx FIFO size */
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
126edbbb3ca107715067b27a71e6ea7f58750912aa2Jesse Brandeburg#define E1000_FC_PAUSE_TIME 0xFFFF /* pause for the max or until send xon */
1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* How many Tx Descriptors do we need to call netif_wake_queue ? */
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define E1000_TX_QUEUE_WAKE	16
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* How many Rx Buffers do we bundle into one write to the hardware ? */
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define E1000_RX_BUFFER_WRITE	16	/* Must be power of 2 */
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1332648345fcbadfae8e7113112ff9402e465a184dcMalli Chilakala#define AUTO_ALL_MODES            0
13470cf362ba988b4e6c9027cd7acff158e46a95b15Malli Chilakala#define E1000_EEPROM_82544_APM    0x0004
1352648345fcbadfae8e7113112ff9402e465a184dcMalli Chilakala#define E1000_EEPROM_APME         0x0400
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef E1000_MASTER_SLAVE
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Switch to override PHY master/slave setting */
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define E1000_MASTER_SLAVE	e1000_ms_hw_default
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
142b11840204f36f9a1e3027033227e17d167e04377Joe Perches#define E1000_MNG_VLAN_NONE (-1)
1432d7edb923a823660b081bd4c660300ee19adca8dMalli Chilakala
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* wrapper around a pointer to a socket buffer,
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * so a DMA handle can be stored along with the buffer */
1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct e1000_buffer {
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct sk_buff *skb;
148c6963ef571eb59b29629714c6ba3070dcca0468dMalli Chilakala	dma_addr_t dma;
149edbbb3ca107715067b27a71e6ea7f58750912aa2Jesse Brandeburg	struct page *page;
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long time_stamp;
151406874a7ccee927049b1c182df69457718b938daJoe Perches	u16 length;
152406874a7ccee927049b1c182df69457718b938daJoe Perches	u16 next_to_watch;
15331c15a2f24ebdab14333d9bf5df49757842ae2ecDean Nelson	unsigned int segs;
15431c15a2f24ebdab14333d9bf5df49757842ae2ecDean Nelson	unsigned int bytecount;
155602c0554d7b00c9703e1a0bc584e9c583f577642Alexander Duyck	u16 mapped_as_page;
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
158581d708eb47cccb5f41bc0817e50c9b004011ba8Mallikarjuna R Chilakalastruct e1000_tx_ring {
159581d708eb47cccb5f41bc0817e50c9b004011ba8Mallikarjuna R Chilakala	/* pointer to the descriptor ring memory */
160581d708eb47cccb5f41bc0817e50c9b004011ba8Mallikarjuna R Chilakala	void *desc;
161581d708eb47cccb5f41bc0817e50c9b004011ba8Mallikarjuna R Chilakala	/* physical address of the descriptor ring */
162581d708eb47cccb5f41bc0817e50c9b004011ba8Mallikarjuna R Chilakala	dma_addr_t dma;
163581d708eb47cccb5f41bc0817e50c9b004011ba8Mallikarjuna R Chilakala	/* length of descriptor ring in bytes */
164581d708eb47cccb5f41bc0817e50c9b004011ba8Mallikarjuna R Chilakala	unsigned int size;
165581d708eb47cccb5f41bc0817e50c9b004011ba8Mallikarjuna R Chilakala	/* number of descriptors in the ring */
166581d708eb47cccb5f41bc0817e50c9b004011ba8Mallikarjuna R Chilakala	unsigned int count;
167581d708eb47cccb5f41bc0817e50c9b004011ba8Mallikarjuna R Chilakala	/* next descriptor to associate a buffer with */
168581d708eb47cccb5f41bc0817e50c9b004011ba8Mallikarjuna R Chilakala	unsigned int next_to_use;
169581d708eb47cccb5f41bc0817e50c9b004011ba8Mallikarjuna R Chilakala	/* next descriptor to check for DD status bit */
170581d708eb47cccb5f41bc0817e50c9b004011ba8Mallikarjuna R Chilakala	unsigned int next_to_clean;
171581d708eb47cccb5f41bc0817e50c9b004011ba8Mallikarjuna R Chilakala	/* array of buffer information structs */
172581d708eb47cccb5f41bc0817e50c9b004011ba8Mallikarjuna R Chilakala	struct e1000_buffer *buffer_info;
173581d708eb47cccb5f41bc0817e50c9b004011ba8Mallikarjuna R Chilakala
174406874a7ccee927049b1c182df69457718b938daJoe Perches	u16 tdh;
175406874a7ccee927049b1c182df69457718b938daJoe Perches	u16 tdt;
176c3033b01d763aff572080db09ddcebed115b9cf5Joe Perches	bool last_tx_tso;
177581d708eb47cccb5f41bc0817e50c9b004011ba8Mallikarjuna R Chilakala};
178581d708eb47cccb5f41bc0817e50c9b004011ba8Mallikarjuna R Chilakala
179581d708eb47cccb5f41bc0817e50c9b004011ba8Mallikarjuna R Chilakalastruct e1000_rx_ring {
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* pointer to the descriptor ring memory */
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	void *desc;
1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* physical address of the descriptor ring */
1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	dma_addr_t dma;
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* length of descriptor ring in bytes */
1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int size;
1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* number of descriptors in the ring */
1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int count;
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* next descriptor to associate a buffer with */
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int next_to_use;
1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* next descriptor to check for DD status bit */
1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int next_to_clean;
1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* array of buffer information structs */
1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct e1000_buffer *buffer_info;
194edbbb3ca107715067b27a71e6ea7f58750912aa2Jesse Brandeburg	struct sk_buff *rx_skb_top;
195581d708eb47cccb5f41bc0817e50c9b004011ba8Mallikarjuna R Chilakala
196545c67c0a3550545fe50d28c874b0664bc5dc882Jeff Kirsher	/* cpu for rx queue */
197545c67c0a3550545fe50d28c874b0664bc5dc882Jeff Kirsher	int cpu;
198545c67c0a3550545fe50d28c874b0664bc5dc882Jeff Kirsher
199406874a7ccee927049b1c182df69457718b938daJoe Perches	u16 rdh;
200406874a7ccee927049b1c182df69457718b938daJoe Perches	u16 rdt;
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
203b11840204f36f9a1e3027033227e17d167e04377Joe Perches#define E1000_DESC_UNUSED(R)						\
204b11840204f36f9a1e3027033227e17d167e04377Joe Perches	((((R)->next_to_clean > (R)->next_to_use)			\
205b11840204f36f9a1e3027033227e17d167e04377Joe Perches	  ? 0 : (R)->count) + (R)->next_to_clean - (R)->next_to_use - 1)
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
207b11840204f36f9a1e3027033227e17d167e04377Joe Perches#define E1000_RX_DESC_EXT(R, i)						\
2082d7edb923a823660b081bd4c660300ee19adca8dMalli Chilakala	(&(((union e1000_rx_desc_extended *)((R).desc))[i]))
2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define E1000_GET_DESC(R, i, type)	(&(((struct type *)((R).desc))[i]))
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define E1000_RX_DESC(R, i)		E1000_GET_DESC(R, i, e1000_rx_desc)
2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define E1000_TX_DESC(R, i)		E1000_GET_DESC(R, i, e1000_tx_desc)
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define E1000_CONTEXT_DESC(R, i)	E1000_GET_DESC(R, i, e1000_context_desc)
2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* board specific private data structure */
2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct e1000_adapter {
2175622e4044a916de1af84bfcc4d437ce0c799d531Jiri Pirko	unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];
218406874a7ccee927049b1c182df69457718b938daJoe Perches	u16 mng_vlan_id;
219406874a7ccee927049b1c182df69457718b938daJoe Perches	u32 bd_number;
220406874a7ccee927049b1c182df69457718b938daJoe Perches	u32 rx_buffer_len;
221406874a7ccee927049b1c182df69457718b938daJoe Perches	u32 wol;
222406874a7ccee927049b1c182df69457718b938daJoe Perches	u32 smartspeed;
223406874a7ccee927049b1c182df69457718b938daJoe Perches	u32 en_mng_pt;
224406874a7ccee927049b1c182df69457718b938daJoe Perches	u16 link_speed;
225406874a7ccee927049b1c182df69457718b938daJoe Perches	u16 link_duplex;
2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	spinlock_t stats_lock;
227835bb1298311f372a3387fb40b952b18d90aa9f8Jesse Brandeburg	unsigned int total_tx_bytes;
228835bb1298311f372a3387fb40b952b18d90aa9f8Jesse Brandeburg	unsigned int total_tx_packets;
229835bb1298311f372a3387fb40b952b18d90aa9f8Jesse Brandeburg	unsigned int total_rx_bytes;
230835bb1298311f372a3387fb40b952b18d90aa9f8Jesse Brandeburg	unsigned int total_rx_packets;
231835bb1298311f372a3387fb40b952b18d90aa9f8Jesse Brandeburg	/* Interrupt Throttle Rate */
232406874a7ccee927049b1c182df69457718b938daJoe Perches	u32 itr;
233406874a7ccee927049b1c182df69457718b938daJoe Perches	u32 itr_setting;
234406874a7ccee927049b1c182df69457718b938daJoe Perches	u16 tx_itr;
235406874a7ccee927049b1c182df69457718b938daJoe Perches	u16 rx_itr;
236835bb1298311f372a3387fb40b952b18d90aa9f8Jesse Brandeburg
237406874a7ccee927049b1c182df69457718b938daJoe Perches	u8 fc_autoneg;
2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* TX */
240581d708eb47cccb5f41bc0817e50c9b004011ba8Mallikarjuna R Chilakala	struct e1000_tx_ring *tx_ring;      /* One per active queue */
241fcfb1224250d7877b6a6c6a947986e08b2160fb6Jesse Brandeburg	unsigned int restart_queue;
242406874a7ccee927049b1c182df69457718b938daJoe Perches	u32 txd_cmd;
243406874a7ccee927049b1c182df69457718b938daJoe Perches	u32 tx_int_delay;
244406874a7ccee927049b1c182df69457718b938daJoe Perches	u32 tx_abs_int_delay;
245406874a7ccee927049b1c182df69457718b938daJoe Perches	u32 gotcl;
246406874a7ccee927049b1c182df69457718b938daJoe Perches	u64 gotcl_old;
247406874a7ccee927049b1c182df69457718b938daJoe Perches	u64 tpt_old;
248406874a7ccee927049b1c182df69457718b938daJoe Perches	u64 colc_old;
249406874a7ccee927049b1c182df69457718b938daJoe Perches	u32 tx_timeout_count;
250406874a7ccee927049b1c182df69457718b938daJoe Perches	u32 tx_fifo_head;
251406874a7ccee927049b1c182df69457718b938daJoe Perches	u32 tx_head_addr;
252406874a7ccee927049b1c182df69457718b938daJoe Perches	u32 tx_fifo_size;
253406874a7ccee927049b1c182df69457718b938daJoe Perches	u8  tx_timeout_factor;
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	atomic_t tx_fifo_stall;
255c3033b01d763aff572080db09ddcebed115b9cf5Joe Perches	bool pcix_82544;
256c3033b01d763aff572080db09ddcebed115b9cf5Joe Perches	bool detect_tx_hung;
257b04e36bac5075ceeacf11b639fbf0cb69aa68996Tushar Dave	bool dump_buffers;
2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* RX */
260e982f17c87488a98df6bc4f5454a176646b4d00bJoe Perches	bool (*clean_rx)(struct e1000_adapter *adapter,
261e982f17c87488a98df6bc4f5454a176646b4d00bJoe Perches			 struct e1000_rx_ring *rx_ring,
262e982f17c87488a98df6bc4f5454a176646b4d00bJoe Perches			 int *work_done, int work_to_do);
263e982f17c87488a98df6bc4f5454a176646b4d00bJoe Perches	void (*alloc_rx_buf)(struct e1000_adapter *adapter,
264e982f17c87488a98df6bc4f5454a176646b4d00bJoe Perches			     struct e1000_rx_ring *rx_ring,
265e982f17c87488a98df6bc4f5454a176646b4d00bJoe Perches			     int cleaned_count);
266581d708eb47cccb5f41bc0817e50c9b004011ba8Mallikarjuna R Chilakala	struct e1000_rx_ring *rx_ring;      /* One per active queue */
267bea3348eef27e6044b6161fd04c3152215f96411Stephen Hemminger	struct napi_struct napi;
268c3570acb53c885f8accb8c85eda195781d30632fFrancois Romieu
269f56799ea39a85a6f3760a134aa0e6d1c17eea369Jeff Kirsher	int num_tx_queues;
270f56799ea39a85a6f3760a134aa0e6d1c17eea369Jeff Kirsher	int num_rx_queues;
271581d708eb47cccb5f41bc0817e50c9b004011ba8Mallikarjuna R Chilakala
272406874a7ccee927049b1c182df69457718b938daJoe Perches	u64 hw_csum_err;
273406874a7ccee927049b1c182df69457718b938daJoe Perches	u64 hw_csum_good;
274406874a7ccee927049b1c182df69457718b938daJoe Perches	u32 alloc_rx_buff_failed;
275406874a7ccee927049b1c182df69457718b938daJoe Perches	u32 rx_int_delay;
276406874a7ccee927049b1c182df69457718b938daJoe Perches	u32 rx_abs_int_delay;
277c3033b01d763aff572080db09ddcebed115b9cf5Joe Perches	bool rx_csum;
278406874a7ccee927049b1c182df69457718b938daJoe Perches	u32 gorcl;
279406874a7ccee927049b1c182df69457718b938daJoe Perches	u64 gorcl_old;
2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* OS defined structs */
2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct net_device *netdev;
2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct pci_dev *pdev;
2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* structs defined in e1000_hw.h */
2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct e1000_hw hw;
2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct e1000_hw_stats stats;
2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct e1000_phy_info phy_info;
2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct e1000_phy_stats phy_stats;
2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
291406874a7ccee927049b1c182df69457718b938daJoe Perches	u32 test_icr;
292581d708eb47cccb5f41bc0817e50c9b004011ba8Mallikarjuna R Chilakala	struct e1000_tx_ring test_tx_ring;
293581d708eb47cccb5f41bc0817e50c9b004011ba8Mallikarjuna R Chilakala	struct e1000_rx_ring test_rx_ring;
2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int msg_enable;
296e94bd23f67c87011f012f26ca0af3fcf6878eeacAuke Kok
2977e6c9861bbc2fcd2438da910c006781784968a7cJeff Kirsher	/* to not mess up cache alignment, always add to the bottom */
298c3033b01d763aff572080db09ddcebed115b9cf5Joe Perches	bool tso_force;
299c3033b01d763aff572080db09ddcebed115b9cf5Joe Perches	bool smart_power_down;	/* phy smart power down */
300c3033b01d763aff572080db09ddcebed115b9cf5Joe Perches	bool quad_port_a;
3012db10a081c5c1082d58809a1bcf1a6073f4db160Auke Kok	unsigned long flags;
302406874a7ccee927049b1c182df69457718b938daJoe Perches	u32 eeprom_wol;
30381250297d85b26eb4e9de5decf752dce430277f9Taku Izumi
30481250297d85b26eb4e9de5decf752dce430277f9Taku Izumi	/* for ioport free */
30581250297d85b26eb4e9de5decf752dce430277f9Taku Izumi	int bars;
30681250297d85b26eb4e9de5decf752dce430277f9Taku Izumi	int need_ioport;
30740a14deaf411592b57cb0720f0e8004293ab9865Jesse Brandeburg
30840a14deaf411592b57cb0720f0e8004293ab9865Jesse Brandeburg	bool discarding;
3095cf42fcda0fdddfe7f5ea8629cb7b820bf7e91abJesse Brandeburg
310a4010afef585b7142eb605e3a6e4210c0e1b2957Jesse Brandeburg	struct work_struct reset_task;
311a4010afef585b7142eb605e3a6e4210c0e1b2957Jesse Brandeburg	struct delayed_work watchdog_task;
312a4010afef585b7142eb605e3a6e4210c0e1b2957Jesse Brandeburg	struct delayed_work fifo_stall_task;
313a4010afef585b7142eb605e3a6e4210c0e1b2957Jesse Brandeburg	struct delayed_work phy_info_task;
3140ef4eedc2e98edd51cd106e1f6a27178622b7e57Jesse Brandeburg
3150ef4eedc2e98edd51cd106e1f6a27178622b7e57Jesse Brandeburg	struct mutex mutex;
3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
31730dcbf29cc6d92d70fa262e79e84011fe6913bedAdrian Bunk
3182db10a081c5c1082d58809a1bcf1a6073f4db160Auke Kokenum e1000_state_t {
3191314bbf3a3d911218fc153e14873e2e384d08084Auke Kok	__E1000_TESTING,
3202db10a081c5c1082d58809a1bcf1a6073f4db160Auke Kok	__E1000_RESETTING,
3211314bbf3a3d911218fc153e14873e2e384d08084Auke Kok	__E1000_DOWN
3222db10a081c5c1082d58809a1bcf1a6073f4db160Auke Kok};
32330dcbf29cc6d92d70fa262e79e84011fe6913bedAdrian Bunk
324675ad47375c76a7c3be4ace9554d92cd55518cedEmil Tantilov#undef pr_fmt
325675ad47375c76a7c3be4ace9554d92cd55518cedEmil Tantilov#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
326675ad47375c76a7c3be4ace9554d92cd55518cedEmil Tantilov
327675ad47375c76a7c3be4ace9554d92cd55518cedEmil Tantilovextern struct net_device *e1000_get_hw_dev(struct e1000_hw *hw);
328675ad47375c76a7c3be4ace9554d92cd55518cedEmil Tantilov#define e_dbg(format, arg...) \
329675ad47375c76a7c3be4ace9554d92cd55518cedEmil Tantilov	netdev_dbg(e1000_get_hw_dev(hw), format, ## arg)
330feb8f47809fcc60250d28a6ddabc0ddbe9360d7cEmil Tantilov#define e_err(msglvl, format, arg...) \
331feb8f47809fcc60250d28a6ddabc0ddbe9360d7cEmil Tantilov	netif_err(adapter, msglvl, adapter->netdev, format, ## arg)
332feb8f47809fcc60250d28a6ddabc0ddbe9360d7cEmil Tantilov#define e_info(msglvl, format, arg...) \
333feb8f47809fcc60250d28a6ddabc0ddbe9360d7cEmil Tantilov	netif_info(adapter, msglvl, adapter->netdev, format, ## arg)
334feb8f47809fcc60250d28a6ddabc0ddbe9360d7cEmil Tantilov#define e_warn(msglvl, format, arg...) \
335feb8f47809fcc60250d28a6ddabc0ddbe9360d7cEmil Tantilov	netif_warn(adapter, msglvl, adapter->netdev, format, ## arg)
336feb8f47809fcc60250d28a6ddabc0ddbe9360d7cEmil Tantilov#define e_notice(msglvl, format, arg...) \
337feb8f47809fcc60250d28a6ddabc0ddbe9360d7cEmil Tantilov	netif_notice(adapter, msglvl, adapter->netdev, format, ## arg)
338675ad47375c76a7c3be4ace9554d92cd55518cedEmil Tantilov#define e_dev_info(format, arg...) \
339675ad47375c76a7c3be4ace9554d92cd55518cedEmil Tantilov	dev_info(&adapter->pdev->dev, format, ## arg)
340675ad47375c76a7c3be4ace9554d92cd55518cedEmil Tantilov#define e_dev_warn(format, arg...) \
341675ad47375c76a7c3be4ace9554d92cd55518cedEmil Tantilov	dev_warn(&adapter->pdev->dev, format, ## arg)
342feb8f47809fcc60250d28a6ddabc0ddbe9360d7cEmil Tantilov#define e_dev_err(format, arg...) \
343feb8f47809fcc60250d28a6ddabc0ddbe9360d7cEmil Tantilov	dev_err(&adapter->pdev->dev, format, ## arg)
344675ad47375c76a7c3be4ace9554d92cd55518cedEmil Tantilov
345abec42a4f87795766f77e4595b7e540b5fc60e3fStephen Hemmingerextern char e1000_driver_name[];
346abec42a4f87795766f77e4595b7e540b5fc60e3fStephen Hemmingerextern const char e1000_driver_version[];
347abec42a4f87795766f77e4595b7e540b5fc60e3fStephen Hemminger
348c03e83b0351f8a9464d32f31302ec75ba88518dcJoe Perchesextern int e1000_up(struct e1000_adapter *adapter);
349c03e83b0351f8a9464d32f31302ec75ba88518dcJoe Perchesextern void e1000_down(struct e1000_adapter *adapter);
350c03e83b0351f8a9464d32f31302ec75ba88518dcJoe Perchesextern void e1000_reinit_locked(struct e1000_adapter *adapter);
351c03e83b0351f8a9464d32f31302ec75ba88518dcJoe Perchesextern void e1000_reset(struct e1000_adapter *adapter);
35214ad2513ed5b709e566a853f4b515d91c5d83311David Decotignyextern int e1000_set_spd_dplx(struct e1000_adapter *adapter, u32 spd, u8 dplx);
353c03e83b0351f8a9464d32f31302ec75ba88518dcJoe Perchesextern int e1000_setup_all_rx_resources(struct e1000_adapter *adapter);
354c03e83b0351f8a9464d32f31302ec75ba88518dcJoe Perchesextern int e1000_setup_all_tx_resources(struct e1000_adapter *adapter);
355c03e83b0351f8a9464d32f31302ec75ba88518dcJoe Perchesextern void e1000_free_all_rx_resources(struct e1000_adapter *adapter);
356c03e83b0351f8a9464d32f31302ec75ba88518dcJoe Perchesextern void e1000_free_all_tx_resources(struct e1000_adapter *adapter);
357c03e83b0351f8a9464d32f31302ec75ba88518dcJoe Perchesextern void e1000_update_stats(struct e1000_adapter *adapter);
358b548192acaebcb05d6a87d1e94f19835b1a18a8bNick Nunleyextern bool e1000_has_link(struct e1000_adapter *adapter);
359abec42a4f87795766f77e4595b7e540b5fc60e3fStephen Hemmingerextern void e1000_power_up_phy(struct e1000_adapter *);
360abec42a4f87795766f77e4595b7e540b5fc60e3fStephen Hemmingerextern void e1000_set_ethtool_ops(struct net_device *netdev);
361abec42a4f87795766f77e4595b7e540b5fc60e3fStephen Hemmingerextern void e1000_check_options(struct e1000_adapter *adapter);
362675ad47375c76a7c3be4ace9554d92cd55518cedEmil Tantilovextern char *e1000_get_hw_dev_name(struct e1000_hw *hw);
363abec42a4f87795766f77e4595b7e540b5fc60e3fStephen Hemminger
3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* _E1000_H_ */
365