2005-04-17 02:20:36 +04:00
|
|
|
/*******************************************************************************
|
|
|
|
|
2006-09-27 23:53:14 +04:00
|
|
|
Intel PRO/10GbE Linux driver
|
2008-07-09 02:53:09 +04:00
|
|
|
Copyright(c) 1999 - 2008 Intel Corporation.
|
2006-09-27 23:53:14 +04:00
|
|
|
|
|
|
|
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
|
2005-04-17 02:20:36 +04:00
|
|
|
more details.
|
2006-09-27 23:53:14 +04:00
|
|
|
|
2005-04-17 02:20:36 +04:00
|
|
|
You should have received a copy of the GNU General Public License along with
|
2006-09-27 23:53:14 +04:00
|
|
|
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".
|
|
|
|
|
2005-04-17 02:20:36 +04:00
|
|
|
Contact Information:
|
|
|
|
Linux NICS <linux.nics@intel.com>
|
2006-09-27 23:53:14 +04:00
|
|
|
e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
|
2005-04-17 02:20:36 +04:00
|
|
|
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
|
|
|
|
|
2006-05-23 21:34:59 +04:00
|
|
|
#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, \
|
2008-08-21 03:52:04 +04:00
|
|
|
__func__ , ## args))
|
2006-05-23 21:34:59 +04:00
|
|
|
|
2005-04-17 02:20:36 +04:00
|
|
|
|
|
|
|
/* TX/RX descriptor defines */
|
2008-07-09 02:52:58 +04:00
|
|
|
#define DEFAULT_TXD 256
|
|
|
|
#define MAX_TXD 4096
|
|
|
|
#define MIN_TXD 64
|
2005-04-17 02:20:36 +04:00
|
|
|
|
|
|
|
/* hardware cannot reliably support more than 512 descriptors owned by
|
2008-07-09 02:52:28 +04:00
|
|
|
* hardware descriptor cache otherwise an unreliable ring under heavy
|
|
|
|
* receive load may result */
|
2008-07-09 02:52:58 +04:00
|
|
|
#define DEFAULT_RXD 512
|
|
|
|
#define MAX_RXD 512
|
|
|
|
#define MIN_RXD 64
|
2005-04-17 02:20:36 +04:00
|
|
|
|
|
|
|
/* 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 ? */
|
2006-09-27 23:54:17 +04:00
|
|
|
#define IXGB_RX_BUFFER_WRITE 8 /* Must be power of 2 */
|
2005-04-17 02:20:36 +04:00
|
|
|
|
|
|
|
/* 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;
|
2005-08-12 00:59:44 +04:00
|
|
|
dma_addr_t dma;
|
2005-04-17 02:20:36 +04:00
|
|
|
unsigned long time_stamp;
|
2008-04-03 21:06:25 +04:00
|
|
|
u16 length;
|
|
|
|
u16 next_to_watch;
|
2005-04-17 02:20:36 +04:00
|
|
|
};
|
|
|
|
|
|
|
|
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;
|
2008-04-03 21:06:25 +04:00
|
|
|
u32 bd_number;
|
|
|
|
u32 rx_buffer_len;
|
|
|
|
u32 part_num;
|
|
|
|
u16 link_speed;
|
|
|
|
u16 link_duplex;
|
2005-04-17 02:20:36 +04:00
|
|
|
struct work_struct tx_timeout_task;
|
|
|
|
|
|
|
|
struct timer_list blink_timer;
|
|
|
|
unsigned long led_status;
|
|
|
|
|
|
|
|
/* TX */
|
2006-09-01 01:27:51 +04:00
|
|
|
struct ixgb_desc_ring tx_ring ____cacheline_aligned_in_smp;
|
2007-01-06 20:51:38 +03:00
|
|
|
unsigned int restart_queue;
|
2005-04-17 02:20:36 +04:00
|
|
|
unsigned long timeo_start;
|
2008-04-03 21:06:25 +04:00
|
|
|
u32 tx_cmd_type;
|
|
|
|
u64 hw_csum_tx_good;
|
|
|
|
u64 hw_csum_tx_error;
|
|
|
|
u32 tx_int_delay;
|
|
|
|
u32 tx_timeout_count;
|
2008-03-21 21:06:37 +03:00
|
|
|
bool tx_int_delay_enable;
|
|
|
|
bool detect_tx_hung;
|
2005-04-17 02:20:36 +04:00
|
|
|
|
|
|
|
/* RX */
|
|
|
|
struct ixgb_desc_ring rx_ring;
|
2008-04-03 21:06:25 +04:00
|
|
|
u64 hw_csum_rx_error;
|
|
|
|
u64 hw_csum_rx_good;
|
|
|
|
u32 rx_int_delay;
|
2008-03-21 21:06:37 +03:00
|
|
|
bool rx_csum;
|
2005-04-17 02:20:36 +04:00
|
|
|
|
|
|
|
/* OS defined structs */
|
[NET]: Make NAPI polling independent of struct net_device objects.
Several devices have multiple independant RX queues per net
device, and some have a single interrupt doorbell for several
queues.
In either case, it's easier to support layouts like that if the
structure representing the poll is independant from the net
device itself.
The signature of the ->poll() call back goes from:
int foo_poll(struct net_device *dev, int *budget)
to
int foo_poll(struct napi_struct *napi, int budget)
The caller is returned the number of RX packets processed (or
the number of "NAPI credits" consumed if you want to get
abstract). The callee no longer messes around bumping
dev->quota, *budget, etc. because that is all handled in the
caller upon return.
The napi_struct is to be embedded in the device driver private data
structures.
Furthermore, it is the driver's responsibility to disable all NAPI
instances in it's ->stop() device close handler. Since the
napi_struct is privatized into the driver's private data structures,
only the driver knows how to get at all of the napi_struct instances
it may have per-device.
With lots of help and suggestions from Rusty Russell, Roland Dreier,
Michael Chan, Jeff Garzik, and Jamal Hadi Salim.
Bug fixes from Thomas Graf, Roland Dreier, Peter Zijlstra,
Joseph Fannin, Scott Wood, Hans J. Koch, and Michael Chan.
[ Ported to current tree and all drivers converted. Integrated
Stephen's follow-on kerneldoc additions, and restored poll_list
handling to the old style to fix mutual exclusion issues. -DaveM ]
Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
2007-10-04 03:41:36 +04:00
|
|
|
struct napi_struct napi;
|
2005-04-17 02:20:36 +04:00
|
|
|
struct net_device *netdev;
|
|
|
|
struct pci_dev *pdev;
|
|
|
|
struct net_device_stats net_stats;
|
|
|
|
|
|
|
|
/* structs defined in ixgb_hw.h */
|
|
|
|
struct ixgb_hw hw;
|
2006-05-23 21:34:59 +04:00
|
|
|
u16 msg_enable;
|
2005-04-17 02:20:36 +04:00
|
|
|
struct ixgb_hw_stats stats;
|
2008-04-03 21:06:25 +04:00
|
|
|
u32 alloc_rx_buff_failed;
|
2008-03-21 21:06:37 +03:00
|
|
|
bool have_msi;
|
2008-03-21 21:06:32 +03:00
|
|
|
unsigned long flags;
|
|
|
|
};
|
|
|
|
|
|
|
|
enum ixgb_state_t {
|
|
|
|
/* TBD
|
|
|
|
__IXGB_TESTING,
|
|
|
|
__IXGB_RESETTING,
|
|
|
|
*/
|
|
|
|
__IXGB_DOWN
|
2005-04-17 02:20:36 +04:00
|
|
|
};
|
2007-10-29 20:46:13 +03:00
|
|
|
|
|
|
|
/* 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[];
|
|
|
|
|
2008-03-21 21:06:42 +03:00
|
|
|
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);
|
|
|
|
|
|
|
|
|
2005-04-17 02:20:36 +04:00
|
|
|
#endif /* _IXGB_H_ */
|