| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 1 | /******************************************************************************* | 
|  | 2 |  | 
|  | 3 | Intel(R) Gigabit Ethernet Linux driver | 
| Alexander Duyck | 86d5d38 | 2009-02-06 23:23:12 +0000 | [diff] [blame] | 4 | Copyright(c) 2007-2009 Intel Corporation. | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 5 |  | 
|  | 6 | This program is free software; you can redistribute it and/or modify it | 
|  | 7 | under the terms and conditions of the GNU General Public License, | 
|  | 8 | version 2, as published by the Free Software Foundation. | 
|  | 9 |  | 
|  | 10 | This program is distributed in the hope it will be useful, but WITHOUT | 
|  | 11 | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | 
|  | 12 | FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for | 
|  | 13 | more details. | 
|  | 14 |  | 
|  | 15 | You should have received a copy of the GNU General Public License along with | 
|  | 16 | this program; if not, write to the Free Software Foundation, Inc., | 
|  | 17 | 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. | 
|  | 18 |  | 
|  | 19 | The full GNU General Public License is included in this distribution in | 
|  | 20 | the file called "COPYING". | 
|  | 21 |  | 
|  | 22 | Contact Information: | 
|  | 23 | e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> | 
|  | 24 | Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 
|  | 25 |  | 
|  | 26 | *******************************************************************************/ | 
|  | 27 |  | 
|  | 28 |  | 
|  | 29 | /* Linux PRO/1000 Ethernet Driver main header file */ | 
|  | 30 |  | 
|  | 31 | #ifndef _IGB_H_ | 
|  | 32 | #define _IGB_H_ | 
|  | 33 |  | 
|  | 34 | #include "e1000_mac.h" | 
|  | 35 | #include "e1000_82575.h" | 
|  | 36 |  | 
| Patrick Ohly | 38c845c | 2009-02-12 05:03:41 +0000 | [diff] [blame] | 37 | #include <linux/clocksource.h> | 
| Patrick Ohly | 33af6bc | 2009-02-12 05:03:43 +0000 | [diff] [blame] | 38 | #include <linux/timecompare.h> | 
|  | 39 | #include <linux/net_tstamp.h> | 
| Patrick Ohly | 38c845c | 2009-02-12 05:03:41 +0000 | [diff] [blame] | 40 |  | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 41 | struct igb_adapter; | 
|  | 42 |  | 
| Alexander Duyck | 6eb5a7f | 2008-07-08 15:14:44 -0700 | [diff] [blame] | 43 | /* ((1000000000ns / (6000ints/s * 1024ns)) << 2 = 648 */ | 
|  | 44 | #define IGB_START_ITR 648 | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 45 |  | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 46 | /* TX/RX descriptor defines */ | 
|  | 47 | #define IGB_DEFAULT_TXD                  256 | 
|  | 48 | #define IGB_MIN_TXD                       80 | 
|  | 49 | #define IGB_MAX_TXD                     4096 | 
|  | 50 |  | 
|  | 51 | #define IGB_DEFAULT_RXD                  256 | 
|  | 52 | #define IGB_MIN_RXD                       80 | 
|  | 53 | #define IGB_MAX_RXD                     4096 | 
|  | 54 |  | 
|  | 55 | #define IGB_DEFAULT_ITR                    3 /* dynamic */ | 
|  | 56 | #define IGB_MAX_ITR_USECS              10000 | 
|  | 57 | #define IGB_MIN_ITR_USECS                 10 | 
| Alexander Duyck | 047e003 | 2009-10-27 15:49:27 +0000 | [diff] [blame] | 58 | #define NON_Q_VECTORS                      1 | 
|  | 59 | #define MAX_Q_VECTORS                      8 | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 60 |  | 
|  | 61 | /* Transmit and receive queues */ | 
| Alexander Duyck | a99955f | 2009-11-12 18:37:19 +0000 | [diff] [blame] | 62 | #define IGB_MAX_RX_QUEUES                  (adapter->vfs_allocated_count ? 2 : \ | 
|  | 63 | (hw->mac.type > e1000_82575 ? 8 : 4)) | 
|  | 64 | #define IGB_ABS_MAX_TX_QUEUES              8 | 
|  | 65 | #define IGB_MAX_TX_QUEUES                  IGB_MAX_RX_QUEUES | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 66 |  | 
| Alexander Duyck | 4ae196d | 2009-02-19 20:40:07 -0800 | [diff] [blame] | 67 | #define IGB_MAX_VF_MC_ENTRIES              30 | 
|  | 68 | #define IGB_MAX_VF_FUNCTIONS               8 | 
|  | 69 | #define IGB_MAX_VFTA_ENTRIES               128 | 
|  | 70 |  | 
|  | 71 | struct vf_data_storage { | 
|  | 72 | unsigned char vf_mac_addresses[ETH_ALEN]; | 
|  | 73 | u16 vf_mc_hashes[IGB_MAX_VF_MC_ENTRIES]; | 
|  | 74 | u16 num_vf_mc_hashes; | 
| Alexander Duyck | ae641bd | 2009-09-03 14:49:33 +0000 | [diff] [blame] | 75 | u16 vlans_enabled; | 
| Alexander Duyck | f2ca0db | 2009-10-27 23:46:57 +0000 | [diff] [blame] | 76 | u32 flags; | 
|  | 77 | unsigned long last_nack; | 
| Williams, Mitch A | 8151d29 | 2010-02-10 01:44:24 +0000 | [diff] [blame] | 78 | u16 pf_vlan; /* When set, guest VLAN config not allowed. */ | 
|  | 79 | u16 pf_qos; | 
| Alexander Duyck | 4ae196d | 2009-02-19 20:40:07 -0800 | [diff] [blame] | 80 | }; | 
|  | 81 |  | 
| Alexander Duyck | f2ca0db | 2009-10-27 23:46:57 +0000 | [diff] [blame] | 82 | #define IGB_VF_FLAG_CTS            0x00000001 /* VF is clear to send data */ | 
| Alexander Duyck | 7d5753f | 2009-10-27 23:47:16 +0000 | [diff] [blame] | 83 | #define IGB_VF_FLAG_UNI_PROMISC    0x00000002 /* VF has unicast promisc */ | 
|  | 84 | #define IGB_VF_FLAG_MULTI_PROMISC  0x00000004 /* VF has multicast promisc */ | 
| Williams, Mitch A | 8151d29 | 2010-02-10 01:44:24 +0000 | [diff] [blame] | 85 | #define IGB_VF_FLAG_PF_SET_MAC     0x00000008 /* PF has set MAC address */ | 
| Alexander Duyck | f2ca0db | 2009-10-27 23:46:57 +0000 | [diff] [blame] | 86 |  | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 87 | /* RX descriptor control thresholds. | 
|  | 88 | * PTHRESH - MAC will consider prefetch if it has fewer than this number of | 
|  | 89 | *           descriptors available in its onboard memory. | 
|  | 90 | *           Setting this to 0 disables RX descriptor prefetch. | 
|  | 91 | * HTHRESH - MAC will only prefetch if there are at least this many descriptors | 
|  | 92 | *           available in host memory. | 
|  | 93 | *           If PTHRESH is 0, this should also be 0. | 
|  | 94 | * WTHRESH - RX descriptor writeback threshold - MAC will delay writing back | 
|  | 95 | *           descriptors until either it has this many to write back, or the | 
|  | 96 | *           ITR timer expires. | 
|  | 97 | */ | 
| Nick Nunley | 58fd62f | 2010-02-17 01:05:56 +0000 | [diff] [blame] | 98 | #define IGB_RX_PTHRESH                     8 | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 99 | #define IGB_RX_HTHRESH                     8 | 
|  | 100 | #define IGB_RX_WTHRESH                     1 | 
| Alexander Duyck | 85b430b | 2009-10-27 15:50:29 +0000 | [diff] [blame] | 101 | #define IGB_TX_PTHRESH                     8 | 
|  | 102 | #define IGB_TX_HTHRESH                     1 | 
|  | 103 | #define IGB_TX_WTHRESH                     ((hw->mac.type == e1000_82576 && \ | 
| Nick Nunley | 58fd62f | 2010-02-17 01:05:56 +0000 | [diff] [blame] | 104 | adapter->msix_entries) ? 1 : 16) | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 105 |  | 
|  | 106 | /* this is the size past which hardware will drop packets when setting LPE=0 */ | 
|  | 107 | #define MAXIMUM_ETHERNET_VLAN_SIZE 1522 | 
|  | 108 |  | 
|  | 109 | /* Supported Rx Buffer Sizes */ | 
| Nick Nunley | 757b77e | 2010-03-26 11:36:47 +0000 | [diff] [blame] | 110 | #define IGB_RXBUFFER_64    64     /* Used for packet split */ | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 111 | #define IGB_RXBUFFER_128   128    /* Used for packet split */ | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 112 | #define IGB_RXBUFFER_1024  1024 | 
|  | 113 | #define IGB_RXBUFFER_2048  2048 | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 114 | #define IGB_RXBUFFER_16384 16384 | 
|  | 115 |  | 
| Alexander Duyck | e173952 | 2009-02-19 20:39:44 -0800 | [diff] [blame] | 116 | #define MAX_STD_JUMBO_FRAME_SIZE 9234 | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 117 |  | 
|  | 118 | /* How many Tx Descriptors do we need to call netif_wake_queue ? */ | 
|  | 119 | #define IGB_TX_QUEUE_WAKE	16 | 
|  | 120 | /* How many Rx Buffers do we bundle into one write to the hardware ? */ | 
|  | 121 | #define IGB_RX_BUFFER_WRITE	16	/* Must be power of 2 */ | 
|  | 122 |  | 
|  | 123 | #define AUTO_ALL_MODES            0 | 
|  | 124 | #define IGB_EEPROM_APME         0x0400 | 
|  | 125 |  | 
|  | 126 | #ifndef IGB_MASTER_SLAVE | 
|  | 127 | /* Switch to override PHY master/slave setting */ | 
|  | 128 | #define IGB_MASTER_SLAVE	e1000_ms_hw_default | 
|  | 129 | #endif | 
|  | 130 |  | 
|  | 131 | #define IGB_MNG_VLAN_NONE -1 | 
|  | 132 |  | 
|  | 133 | /* wrapper around a pointer to a socket buffer, | 
|  | 134 | * so a DMA handle can be stored along with the buffer */ | 
|  | 135 | struct igb_buffer { | 
|  | 136 | struct sk_buff *skb; | 
|  | 137 | dma_addr_t dma; | 
|  | 138 | union { | 
|  | 139 | /* TX */ | 
|  | 140 | struct { | 
|  | 141 | unsigned long time_stamp; | 
| Alexander Duyck | 0e014cb | 2008-12-26 01:33:18 -0800 | [diff] [blame] | 142 | u16 length; | 
|  | 143 | u16 next_to_watch; | 
| Nick Nunley | 2873957 | 2010-05-04 21:58:07 +0000 | [diff] [blame] | 144 | unsigned int bytecount; | 
| Nick Nunley | 40e90c2 | 2010-02-17 01:04:37 +0000 | [diff] [blame] | 145 | u16 gso_segs; | 
| Nick Nunley | 2873957 | 2010-05-04 21:58:07 +0000 | [diff] [blame] | 146 | union skb_shared_tx shtx; | 
|  | 147 | u8 mapped_as_page; | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 148 | }; | 
|  | 149 | /* RX */ | 
|  | 150 | struct { | 
|  | 151 | struct page *page; | 
| Alexander Duyck | 6366ad3 | 2009-12-02 16:47:18 +0000 | [diff] [blame] | 152 | dma_addr_t page_dma; | 
|  | 153 | u16 page_offset; | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 154 | }; | 
|  | 155 | }; | 
|  | 156 | }; | 
|  | 157 |  | 
| Jesper Dangaard Brouer | 8c0ab70 | 2009-05-26 13:50:31 +0000 | [diff] [blame] | 158 | struct igb_tx_queue_stats { | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 159 | u64 packets; | 
|  | 160 | u64 bytes; | 
| Alexander Duyck | 04a5fca | 2009-10-27 15:52:27 +0000 | [diff] [blame] | 161 | u64 restart_queue; | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 162 | }; | 
|  | 163 |  | 
| Jesper Dangaard Brouer | 8c0ab70 | 2009-05-26 13:50:31 +0000 | [diff] [blame] | 164 | struct igb_rx_queue_stats { | 
|  | 165 | u64 packets; | 
|  | 166 | u64 bytes; | 
|  | 167 | u64 drops; | 
| Alexander Duyck | 04a5fca | 2009-10-27 15:52:27 +0000 | [diff] [blame] | 168 | u64 csum_err; | 
|  | 169 | u64 alloc_failed; | 
| Jesper Dangaard Brouer | 8c0ab70 | 2009-05-26 13:50:31 +0000 | [diff] [blame] | 170 | }; | 
|  | 171 |  | 
| Alexander Duyck | 047e003 | 2009-10-27 15:49:27 +0000 | [diff] [blame] | 172 | struct igb_q_vector { | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 173 | struct igb_adapter *adapter; /* backlink */ | 
| Alexander Duyck | 047e003 | 2009-10-27 15:49:27 +0000 | [diff] [blame] | 174 | struct igb_ring *rx_ring; | 
|  | 175 | struct igb_ring *tx_ring; | 
|  | 176 | struct napi_struct napi; | 
|  | 177 |  | 
|  | 178 | u32 eims_value; | 
|  | 179 | u16 cpu; | 
|  | 180 |  | 
|  | 181 | u16 itr_val; | 
|  | 182 | u8 set_itr; | 
| Alexander Duyck | 047e003 | 2009-10-27 15:49:27 +0000 | [diff] [blame] | 183 | void __iomem *itr_register; | 
|  | 184 |  | 
|  | 185 | char name[IFNAMSIZ + 9]; | 
|  | 186 | }; | 
|  | 187 |  | 
|  | 188 | struct igb_ring { | 
|  | 189 | struct igb_q_vector *q_vector; /* backlink to q_vector */ | 
| Alexander Duyck | e694e96 | 2009-10-27 15:53:06 +0000 | [diff] [blame] | 190 | struct net_device *netdev;     /* back pointer to net_device */ | 
| Alexander Duyck | 59d7198 | 2010-04-27 13:09:25 +0000 | [diff] [blame] | 191 | struct device *dev;            /* device pointer for dma mapping */ | 
| Alexander Duyck | 047e003 | 2009-10-27 15:49:27 +0000 | [diff] [blame] | 192 | dma_addr_t dma;                /* phys address of the ring */ | 
| Alexander Duyck | e694e96 | 2009-10-27 15:53:06 +0000 | [diff] [blame] | 193 | void *desc;                    /* descriptor ring memory */ | 
| Alexander Duyck | 047e003 | 2009-10-27 15:49:27 +0000 | [diff] [blame] | 194 | unsigned int size;             /* length of desc. ring in bytes */ | 
| Alexander Duyck | 2e5655e | 2009-10-27 23:50:38 +0000 | [diff] [blame] | 195 | u16 count;                     /* number of desc. in the ring */ | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 196 | u16 next_to_use; | 
|  | 197 | u16 next_to_clean; | 
| Alexander Duyck | 2e5655e | 2009-10-27 23:50:38 +0000 | [diff] [blame] | 198 | u8 queue_index; | 
|  | 199 | u8 reg_idx; | 
| Alexander Duyck | fce99e3 | 2009-10-27 15:51:27 +0000 | [diff] [blame] | 200 | void __iomem *head; | 
|  | 201 | void __iomem *tail; | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 202 | struct igb_buffer *buffer_info; /* array of buffer info structs */ | 
|  | 203 |  | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 204 | unsigned int total_bytes; | 
|  | 205 | unsigned int total_packets; | 
|  | 206 |  | 
| Alexander Duyck | 85ad76b | 2009-10-27 15:52:46 +0000 | [diff] [blame] | 207 | u32 flags; | 
|  | 208 |  | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 209 | union { | 
|  | 210 | /* TX */ | 
|  | 211 | struct { | 
| Jesper Dangaard Brouer | 8c0ab70 | 2009-05-26 13:50:31 +0000 | [diff] [blame] | 212 | struct igb_tx_queue_stats tx_stats; | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 213 | bool detect_tx_hung; | 
|  | 214 | }; | 
|  | 215 | /* RX */ | 
|  | 216 | struct { | 
| Jesper Dangaard Brouer | 8c0ab70 | 2009-05-26 13:50:31 +0000 | [diff] [blame] | 217 | struct igb_rx_queue_stats rx_stats; | 
| Alexander Duyck | 4c84485 | 2009-10-27 15:52:07 +0000 | [diff] [blame] | 218 | u32 rx_buffer_len; | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 219 | }; | 
|  | 220 | }; | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 221 | }; | 
|  | 222 |  | 
| Alexander Duyck | 85ad76b | 2009-10-27 15:52:46 +0000 | [diff] [blame] | 223 | #define IGB_RING_FLAG_RX_CSUM        0x00000001 /* RX CSUM enabled */ | 
|  | 224 | #define IGB_RING_FLAG_RX_SCTP_CSUM   0x00000002 /* SCTP CSUM offload enabled */ | 
|  | 225 |  | 
|  | 226 | #define IGB_RING_FLAG_TX_CTX_IDX     0x00000001 /* HW requires context index */ | 
|  | 227 |  | 
|  | 228 | #define IGB_ADVTXD_DCMD (E1000_TXD_CMD_EOP | E1000_TXD_CMD_RS) | 
|  | 229 |  | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 230 | #define E1000_RX_DESC_ADV(R, i)	    \ | 
|  | 231 | (&(((union e1000_adv_rx_desc *)((R).desc))[i])) | 
|  | 232 | #define E1000_TX_DESC_ADV(R, i)	    \ | 
|  | 233 | (&(((union e1000_adv_tx_desc *)((R).desc))[i])) | 
|  | 234 | #define E1000_TX_CTXTDESC_ADV(R, i)	    \ | 
|  | 235 | (&(((struct e1000_adv_tx_context_desc *)((R).desc))[i])) | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 236 |  | 
| Alexander Duyck | d7ee5b3 | 2009-10-27 15:54:23 +0000 | [diff] [blame] | 237 | /* igb_desc_unused - calculate if we have unused descriptors */ | 
|  | 238 | static inline int igb_desc_unused(struct igb_ring *ring) | 
|  | 239 | { | 
|  | 240 | if (ring->next_to_clean > ring->next_to_use) | 
|  | 241 | return ring->next_to_clean - ring->next_to_use - 1; | 
|  | 242 |  | 
|  | 243 | return ring->count + ring->next_to_clean - ring->next_to_use - 1; | 
|  | 244 | } | 
|  | 245 |  | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 246 | /* board specific private data structure */ | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 247 | struct igb_adapter { | 
|  | 248 | struct timer_list watchdog_timer; | 
|  | 249 | struct timer_list phy_info_timer; | 
|  | 250 | struct vlan_group *vlgrp; | 
|  | 251 | u16 mng_vlan_id; | 
|  | 252 | u32 bd_number; | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 253 | u32 wol; | 
|  | 254 | u32 en_mng_pt; | 
|  | 255 | u16 link_speed; | 
|  | 256 | u16 link_duplex; | 
| Alexander Duyck | 2e5655e | 2009-10-27 23:50:38 +0000 | [diff] [blame] | 257 |  | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 258 | /* Interrupt Throttle Rate */ | 
| Alexander Duyck | 4fc82ad | 2009-10-27 23:45:42 +0000 | [diff] [blame] | 259 | u32 rx_itr_setting; | 
|  | 260 | u32 tx_itr_setting; | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 261 | u16 tx_itr; | 
|  | 262 | u16 rx_itr; | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 263 |  | 
|  | 264 | struct work_struct reset_task; | 
|  | 265 | struct work_struct watchdog_task; | 
|  | 266 | bool fc_autoneg; | 
|  | 267 | u8  tx_timeout_factor; | 
|  | 268 | struct timer_list blink_timer; | 
|  | 269 | unsigned long led_status; | 
|  | 270 |  | 
|  | 271 | /* TX */ | 
| Alexander Duyck | 3025a44 | 2010-02-17 01:02:39 +0000 | [diff] [blame] | 272 | struct igb_ring *tx_ring[16]; | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 273 | u32 tx_timeout_count; | 
|  | 274 |  | 
|  | 275 | /* RX */ | 
| Alexander Duyck | 3025a44 | 2010-02-17 01:02:39 +0000 | [diff] [blame] | 276 | struct igb_ring *rx_ring[16]; | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 277 | int num_tx_queues; | 
|  | 278 | int num_rx_queues; | 
|  | 279 |  | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 280 | u32 max_frame_size; | 
|  | 281 | u32 min_frame_size; | 
|  | 282 |  | 
|  | 283 | /* OS defined structs */ | 
|  | 284 | struct net_device *netdev; | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 285 | struct pci_dev *pdev; | 
| Patrick Ohly | 38c845c | 2009-02-12 05:03:41 +0000 | [diff] [blame] | 286 | struct cyclecounter cycles; | 
|  | 287 | struct timecounter clock; | 
| Patrick Ohly | 33af6bc | 2009-02-12 05:03:43 +0000 | [diff] [blame] | 288 | struct timecompare compare; | 
|  | 289 | struct hwtstamp_config hwtstamp_config; | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 290 |  | 
|  | 291 | /* structs defined in e1000_hw.h */ | 
|  | 292 | struct e1000_hw hw; | 
|  | 293 | struct e1000_hw_stats stats; | 
|  | 294 | struct e1000_phy_info phy_info; | 
|  | 295 | struct e1000_phy_stats phy_stats; | 
|  | 296 |  | 
|  | 297 | u32 test_icr; | 
|  | 298 | struct igb_ring test_tx_ring; | 
|  | 299 | struct igb_ring test_rx_ring; | 
|  | 300 |  | 
|  | 301 | int msg_enable; | 
| Alexander Duyck | 047e003 | 2009-10-27 15:49:27 +0000 | [diff] [blame] | 302 |  | 
|  | 303 | unsigned int num_q_vectors; | 
|  | 304 | struct igb_q_vector *q_vector[MAX_Q_VECTORS]; | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 305 | struct msix_entry *msix_entries; | 
|  | 306 | u32 eims_enable_mask; | 
| PJ Waskiewicz | 844290e | 2008-06-27 11:00:39 -0700 | [diff] [blame] | 307 | u32 eims_other; | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 308 |  | 
|  | 309 | /* to not mess up cache alignment, always add to the bottom */ | 
|  | 310 | unsigned long state; | 
| Alexander Duyck | 7dfc16f | 2008-07-08 15:10:46 -0700 | [diff] [blame] | 311 | unsigned int flags; | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 312 | u32 eeprom_wol; | 
| Taku Izumi | 42bfd33a | 2008-06-20 12:10:30 +0900 | [diff] [blame] | 313 |  | 
| Alexander Duyck | 1bfaf07 | 2009-02-19 20:39:23 -0800 | [diff] [blame] | 314 | struct igb_ring *multi_tx_table[IGB_ABS_MAX_TX_QUEUES]; | 
| Alexander Duyck | 2e5655e | 2009-10-27 23:50:38 +0000 | [diff] [blame] | 315 | u16 tx_ring_count; | 
|  | 316 | u16 rx_ring_count; | 
| Alexander Duyck | 1bfaf07 | 2009-02-19 20:39:23 -0800 | [diff] [blame] | 317 | unsigned int vfs_allocated_count; | 
| Alexander Duyck | 4ae196d | 2009-02-19 20:40:07 -0800 | [diff] [blame] | 318 | struct vf_data_storage *vf_data; | 
| Alexander Duyck | a99955f | 2009-11-12 18:37:19 +0000 | [diff] [blame] | 319 | u32 rss_queues; | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 320 | }; | 
|  | 321 |  | 
| Alexander Duyck | 7dfc16f | 2008-07-08 15:10:46 -0700 | [diff] [blame] | 322 | #define IGB_FLAG_HAS_MSI           (1 << 0) | 
| Alexander Duyck | cbd347a | 2009-02-15 23:59:44 -0800 | [diff] [blame] | 323 | #define IGB_FLAG_DCA_ENABLED       (1 << 1) | 
|  | 324 | #define IGB_FLAG_QUAD_PORT_A       (1 << 2) | 
| Alexander Duyck | 4fc82ad | 2009-10-27 23:45:42 +0000 | [diff] [blame] | 325 | #define IGB_FLAG_QUEUE_PAIRS       (1 << 3) | 
| Alexander Duyck | 7dfc16f | 2008-07-08 15:10:46 -0700 | [diff] [blame] | 326 |  | 
| Alexander Duyck | c5b9bd5 | 2009-10-27 23:46:01 +0000 | [diff] [blame] | 327 | #define IGB_82576_TSYNC_SHIFT 19 | 
| Alexander Duyck | 55cac24 | 2009-11-19 12:42:21 +0000 | [diff] [blame] | 328 | #define IGB_82580_TSYNC_SHIFT 24 | 
| Nick Nunley | 757b77e | 2010-03-26 11:36:47 +0000 | [diff] [blame] | 329 | #define IGB_TS_HDR_LEN        16 | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 330 | enum e1000_state_t { | 
|  | 331 | __IGB_TESTING, | 
|  | 332 | __IGB_RESETTING, | 
|  | 333 | __IGB_DOWN | 
|  | 334 | }; | 
|  | 335 |  | 
|  | 336 | enum igb_boards { | 
|  | 337 | board_82575, | 
|  | 338 | }; | 
|  | 339 |  | 
|  | 340 | extern char igb_driver_name[]; | 
|  | 341 | extern char igb_driver_version[]; | 
|  | 342 |  | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 343 | extern int igb_up(struct igb_adapter *); | 
|  | 344 | extern void igb_down(struct igb_adapter *); | 
|  | 345 | extern void igb_reinit_locked(struct igb_adapter *); | 
|  | 346 | extern void igb_reset(struct igb_adapter *); | 
|  | 347 | extern int igb_set_spd_dplx(struct igb_adapter *, u16); | 
| Alexander Duyck | 8078529 | 2009-10-27 15:51:47 +0000 | [diff] [blame] | 348 | extern int igb_setup_tx_resources(struct igb_ring *); | 
|  | 349 | extern int igb_setup_rx_resources(struct igb_ring *); | 
| Alexander Duyck | 68fd991 | 2008-11-20 00:48:10 -0800 | [diff] [blame] | 350 | extern void igb_free_tx_resources(struct igb_ring *); | 
|  | 351 | extern void igb_free_rx_resources(struct igb_ring *); | 
| Alexander Duyck | d7ee5b3 | 2009-10-27 15:54:23 +0000 | [diff] [blame] | 352 | extern void igb_configure_tx_ring(struct igb_adapter *, struct igb_ring *); | 
|  | 353 | extern void igb_configure_rx_ring(struct igb_adapter *, struct igb_ring *); | 
|  | 354 | extern void igb_setup_tctl(struct igb_adapter *); | 
|  | 355 | extern void igb_setup_rctl(struct igb_adapter *); | 
| Alexander Duyck | b1a436c | 2009-10-27 15:54:43 +0000 | [diff] [blame] | 356 | extern netdev_tx_t igb_xmit_frame_ring_adv(struct sk_buff *, struct igb_ring *); | 
|  | 357 | extern void igb_unmap_and_free_tx_resource(struct igb_ring *, | 
|  | 358 | struct igb_buffer *); | 
| Alexander Duyck | d7ee5b3 | 2009-10-27 15:54:23 +0000 | [diff] [blame] | 359 | extern void igb_alloc_rx_buffers_adv(struct igb_ring *, int); | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 360 | extern void igb_update_stats(struct igb_adapter *); | 
| Nick Nunley | 3145535 | 2010-02-17 01:01:21 +0000 | [diff] [blame] | 361 | extern bool igb_has_link(struct igb_adapter *adapter); | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 362 | extern void igb_set_ethtool_ops(struct net_device *); | 
| Nick Nunley | 88a268c | 2010-02-17 01:01:59 +0000 | [diff] [blame] | 363 | extern void igb_power_up_link(struct igb_adapter *); | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 364 |  | 
| Alexander Duyck | f5f4cf0 | 2008-11-21 21:30:24 -0800 | [diff] [blame] | 365 | static inline s32 igb_reset_phy(struct e1000_hw *hw) | 
|  | 366 | { | 
| Alexander Duyck | a8d2a0c | 2009-02-06 23:17:26 +0000 | [diff] [blame] | 367 | if (hw->phy.ops.reset) | 
|  | 368 | return hw->phy.ops.reset(hw); | 
| Alexander Duyck | f5f4cf0 | 2008-11-21 21:30:24 -0800 | [diff] [blame] | 369 |  | 
|  | 370 | return 0; | 
|  | 371 | } | 
|  | 372 |  | 
|  | 373 | static inline s32 igb_read_phy_reg(struct e1000_hw *hw, u32 offset, u16 *data) | 
|  | 374 | { | 
| Alexander Duyck | a8d2a0c | 2009-02-06 23:17:26 +0000 | [diff] [blame] | 375 | if (hw->phy.ops.read_reg) | 
|  | 376 | return hw->phy.ops.read_reg(hw, offset, data); | 
| Alexander Duyck | f5f4cf0 | 2008-11-21 21:30:24 -0800 | [diff] [blame] | 377 |  | 
|  | 378 | return 0; | 
|  | 379 | } | 
|  | 380 |  | 
|  | 381 | static inline s32 igb_write_phy_reg(struct e1000_hw *hw, u32 offset, u16 data) | 
|  | 382 | { | 
| Alexander Duyck | a8d2a0c | 2009-02-06 23:17:26 +0000 | [diff] [blame] | 383 | if (hw->phy.ops.write_reg) | 
|  | 384 | return hw->phy.ops.write_reg(hw, offset, data); | 
| Alexander Duyck | f5f4cf0 | 2008-11-21 21:30:24 -0800 | [diff] [blame] | 385 |  | 
|  | 386 | return 0; | 
|  | 387 | } | 
|  | 388 |  | 
|  | 389 | static inline s32 igb_get_phy_info(struct e1000_hw *hw) | 
|  | 390 | { | 
|  | 391 | if (hw->phy.ops.get_phy_info) | 
|  | 392 | return hw->phy.ops.get_phy_info(hw); | 
|  | 393 |  | 
|  | 394 | return 0; | 
|  | 395 | } | 
|  | 396 |  | 
| Auke Kok | 9d5c824 | 2008-01-24 02:22:38 -0800 | [diff] [blame] | 397 | #endif /* _IGB_H_ */ |