ixgb.h 6.29 KB
Newer Older
Linus Torvalds's avatar
Linus Torvalds committed
1 2
/*******************************************************************************

3 4 5 6 7 8 9 10 11 12
  Intel PRO/10GbE Linux driver
  Copyright(c) 1999 - 2006 Intel Corporation.

  This program is free software; you can redistribute it and/or modify it
  under the terms and conditions of the GNU General Public License,
  version 2, as published by the Free Software Foundation.

  This program is distributed in the hope it will be useful, but WITHOUT
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
Linus Torvalds's avatar
Linus Torvalds committed
13
  more details.
14

Linus Torvalds's avatar
Linus Torvalds committed
15
  You should have received a copy of the GNU General Public License along with
16 17 18 19 20 21
  this program; if not, write to the Free Software Foundation, Inc.,
  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.

  The full GNU General Public License is included in this distribution in
  the file called "COPYING".

Linus Torvalds's avatar
Linus Torvalds committed
22 23
  Contact Information:
  Linux NICS <linux.nics@intel.com>
24
  e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
Linus Torvalds's avatar
Linus Torvalds committed
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497

*******************************************************************************/

#ifndef _IXGB_H_
#define _IXGB_H_

#include <linux/stddef.h>
#include <linux/module.h>
#include <linux/types.h>
#include <asm/byteorder.h>
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/errno.h>
#include <linux/ioport.h>
#include <linux/pci.h>
#include <linux/kernel.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/skbuff.h>
#include <linux/delay.h>
#include <linux/timer.h>
#include <linux/slab.h>
#include <linux/vmalloc.h>
#include <linux/interrupt.h>
#include <linux/string.h>
#include <linux/pagemap.h>
#include <linux/dma-mapping.h>
#include <linux/bitops.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <linux/capability.h>
#include <linux/in.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/udp.h>
#include <net/pkt_sched.h>
#include <linux/list.h>
#include <linux/reboot.h>
#include <net/checksum.h>

#include <linux/ethtool.h>
#include <linux/if_vlan.h>

#define BAR_0		0
#define BAR_1		1
#define BAR_5		5

struct ixgb_adapter;
#include "ixgb_hw.h"
#include "ixgb_ee.h"
#include "ixgb_ids.h"

#ifdef _DEBUG_DRIVER_
#define IXGB_DBG(args...) printk(KERN_DEBUG "ixgb: " args)
#else
#define IXGB_DBG(args...)
#endif

84 85 86 87 88 89
#define PFX "ixgb: "
#define DPRINTK(nlevel, klevel, fmt, args...) \
	(void)((NETIF_MSG_##nlevel & adapter->msg_enable) && \
	printk(KERN_##klevel PFX "%s: %s: " fmt, adapter->netdev->name, \
		__FUNCTION__ , ## args))

Linus Torvalds's avatar
Linus Torvalds committed
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111

/* TX/RX descriptor defines */
#define DEFAULT_TXD	 256
#define MAX_TXD   	4096
#define MIN_TXD	  64

/* hardware cannot reliably support more than 512 descriptors owned by
 * hardware descrioptor cache otherwise an unreliable ring under heavy 
 * recieve load may result */
/* #define DEFAULT_RXD	   1024 */
/* #define MAX_RXD	   4096 */
#define DEFAULT_RXD	512
#define MAX_RXD	512
#define MIN_RXD	 64

/* Supported Rx Buffer Sizes */
#define IXGB_RXBUFFER_2048  2048
#define IXGB_RXBUFFER_4096  4096
#define IXGB_RXBUFFER_8192  8192
#define IXGB_RXBUFFER_16384 16384

/* How many Rx Buffers do we bundle into one write to the hardware ? */
112
#define IXGB_RX_BUFFER_WRITE	8	/* Must be power of 2 */
Linus Torvalds's avatar
Linus Torvalds committed
113 114 115 116 117

/* wrapper around a pointer to a socket buffer,
 * so a DMA handle can be stored along with the buffer */
struct ixgb_buffer {
	struct sk_buff *skb;
118
	dma_addr_t dma;
Linus Torvalds's avatar
Linus Torvalds committed
119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
	unsigned long time_stamp;
	uint16_t length;
	uint16_t next_to_watch;
};

struct ixgb_desc_ring {
	/* pointer to the descriptor ring memory */
	void *desc;
	/* physical address of the descriptor ring */
	dma_addr_t dma;
	/* length of descriptor ring in bytes */
	unsigned int size;
	/* number of descriptors in the ring */
	unsigned int count;
	/* next descriptor to associate a buffer with */
	unsigned int next_to_use;
	/* next descriptor to check for DD status bit */
	unsigned int next_to_clean;
	/* array of buffer information structs */
	struct ixgb_buffer *buffer_info;
};

#define IXGB_DESC_UNUSED(R) \
	((((R)->next_to_clean > (R)->next_to_use) ? 0 : (R)->count) + \
	(R)->next_to_clean - (R)->next_to_use - 1)

#define IXGB_GET_DESC(R, i, type)	(&(((struct type *)((R).desc))[i]))
#define IXGB_RX_DESC(R, i)		IXGB_GET_DESC(R, i, ixgb_rx_desc)
#define IXGB_TX_DESC(R, i)		IXGB_GET_DESC(R, i, ixgb_tx_desc)
#define IXGB_CONTEXT_DESC(R, i)	IXGB_GET_DESC(R, i, ixgb_context_desc)

/* board specific private data structure */

struct ixgb_adapter {
	struct timer_list watchdog_timer;
	struct vlan_group *vlgrp;
	uint32_t bd_number;
	uint32_t rx_buffer_len;
	uint32_t part_num;
	uint16_t link_speed;
	uint16_t link_duplex;
	spinlock_t tx_lock;
	atomic_t irq_sem;
	struct work_struct tx_timeout_task;

	struct timer_list blink_timer;
	unsigned long led_status;

	/* TX */
168
	struct ixgb_desc_ring tx_ring ____cacheline_aligned_in_smp;
169
	unsigned int restart_queue;
Linus Torvalds's avatar
Linus Torvalds committed
170 171 172 173 174
	unsigned long timeo_start;
	uint32_t tx_cmd_type;
	uint64_t hw_csum_tx_good;
	uint64_t hw_csum_tx_error;
	uint32_t tx_int_delay;
Auke Kok's avatar
Auke Kok committed
175
	uint32_t tx_timeout_count;
176 177
	bool tx_int_delay_enable;
	bool detect_tx_hung;
Linus Torvalds's avatar
Linus Torvalds committed
178 179 180 181 182 183

	/* RX */
	struct ixgb_desc_ring rx_ring;
	uint64_t hw_csum_rx_error;
	uint64_t hw_csum_rx_good;
	uint32_t rx_int_delay;
184
	bool rx_csum;
Linus Torvalds's avatar
Linus Torvalds committed
185 186

	/* OS defined structs */
187
	struct napi_struct napi;
Linus Torvalds's avatar
Linus Torvalds committed
188 189 190 191 192 193
	struct net_device *netdev;
	struct pci_dev *pdev;
	struct net_device_stats net_stats;

	/* structs defined in ixgb_hw.h */
	struct ixgb_hw hw;
194
	u16 msg_enable;
Linus Torvalds's avatar
Linus Torvalds committed
195
	struct ixgb_hw_stats stats;
196
	uint32_t alloc_rx_buff_failed;
197
	bool have_msi;
198 199 200 201 202 203 204 205 206
	unsigned long flags;
};

enum ixgb_state_t {
	/* TBD
	__IXGB_TESTING,
	__IXGB_RESETTING,
	*/
	__IXGB_DOWN
Linus Torvalds's avatar
Linus Torvalds committed
207
};
208 209 210 211 212 213 214

/* Exported from other modules */
extern void ixgb_check_options(struct ixgb_adapter *adapter);
extern void ixgb_set_ethtool_ops(struct net_device *netdev);
extern char ixgb_driver_name[];
extern const char ixgb_driver_version[];

215 216 217 218 219 220 221 222 223 224
extern int ixgb_up(struct ixgb_adapter *adapter);
extern void ixgb_down(struct ixgb_adapter *adapter, bool kill_watchdog);
extern void ixgb_reset(struct ixgb_adapter *adapter);
extern int ixgb_setup_rx_resources(struct ixgb_adapter *adapter);
extern int ixgb_setup_tx_resources(struct ixgb_adapter *adapter);
extern void ixgb_free_rx_resources(struct ixgb_adapter *adapter);
extern void ixgb_free_tx_resources(struct ixgb_adapter *adapter);
extern void ixgb_update_stats(struct ixgb_adapter *adapter);


Linus Torvalds's avatar
Linus Torvalds committed
225
#endif /* _IXGB_H_ */