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