devices/r8169-2.6.27-orig.c
author Gavin Lambert <gavinl@compacsort.com>
Tue, 14 Apr 2015 09:33:24 -0400
changeset 2618 3affe9cd0b66
parent 1898 ecfc3f747a3b
permissions -rw-r--r--
Ignore NXIO error otherwise this causes spam if network is empty or refclk not
selected yet, and syncing refclk time to master.
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
 * r8169.c: RealTek 8169/8168/8101 ethernet driver.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
 *
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     4
 * Copyright (c) 2002 ShuChen <shuchen@realtek.com.tw>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     5
 * Copyright (c) 2003 - 2007 Francois Romieu <romieu@fr.zoreil.com>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     6
 * Copyright (c) a lot of people too. Please respect their work.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     7
 *
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     8
 * See MAINTAINERS file for support contact information.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     9
 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    10
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    11
#include <linux/module.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    12
#include <linux/moduleparam.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    13
#include <linux/pci.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    14
#include <linux/netdevice.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    15
#include <linux/etherdevice.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    16
#include <linux/delay.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    17
#include <linux/ethtool.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    18
#include <linux/mii.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    19
#include <linux/if_vlan.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
#include <linux/crc32.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
#include <linux/in.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    22
#include <linux/ip.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    23
#include <linux/tcp.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    24
#include <linux/init.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    25
#include <linux/dma-mapping.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    26
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    27
#include <asm/system.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
#include <asm/io.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
#include <asm/irq.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
#define RTL8169_VERSION "2.3LK-NAPI"
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
#define MODULENAME "r8169"
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
#define PFX MODULENAME ": "
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
#ifdef RTL8169_DEBUG
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
#define assert(expr) \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    37
	if (!(expr)) {					\
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    38
		printk( "Assertion failed! %s,%s,%s,line=%d\n",	\
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
		#expr,__FILE__,__FUNCTION__,__LINE__);		\
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
#define dprintk(fmt, args...) \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
	do { printk(KERN_DEBUG PFX fmt, ## args); } while (0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
#else
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
#define assert(expr) do {} while (0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
#define dprintk(fmt, args...)	do {} while (0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    46
#endif /* RTL8169_DEBUG */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    47
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    48
#define R8169_MSG_DEFAULT \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    49
	(NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_IFUP | NETIF_MSG_IFDOWN)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    50
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    51
#define TX_BUFFS_AVAIL(tp) \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
	(tp->dirty_tx + NUM_TX_DESC - tp->cur_tx - 1)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    53
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    54
/* Maximum events (Rx packets, etc.) to handle at each interrupt. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    55
static const int max_interrupt_work = 20;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    56
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    57
/* Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    58
   The RTL chips use a 64 element hash table based on the Ethernet CRC. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
static const int multicast_filter_limit = 32;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
/* MAC address length */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
#define MAC_ADDR_LEN	6
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    63
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    64
#define MAX_READ_REQUEST_SHIFT	12
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    65
#define RX_FIFO_THRESH	7	/* 7 means NO threshold, Rx buffer level before first PCI xfer. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    66
#define RX_DMA_BURST	6	/* Maximum PCI burst, '6' is 1024 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    67
#define TX_DMA_BURST	6	/* Maximum PCI burst, '6' is 1024 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    68
#define EarlyTxThld	0x3F	/* 0x3F means NO early transmit */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    69
#define SafeMtu		0x1c20	/* ... actually life sucks beyond ~7k */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
#define InterFrameGap	0x03	/* 3 means InterFrameGap = the shortest one */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    71
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
#define R8169_REGS_SIZE		256
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    73
#define R8169_NAPI_WEIGHT	64
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    74
#define NUM_TX_DESC	64	/* Number of Tx descriptor registers */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    75
#define NUM_RX_DESC	256	/* Number of Rx descriptor registers */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    76
#define RX_BUF_SIZE	1536	/* Rx Buffer size */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    77
#define R8169_TX_RING_BYTES	(NUM_TX_DESC * sizeof(struct TxDesc))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
#define R8169_RX_RING_BYTES	(NUM_RX_DESC * sizeof(struct RxDesc))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    80
#define RTL8169_TX_TIMEOUT	(6*HZ)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    81
#define RTL8169_PHY_TIMEOUT	(10*HZ)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    82
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    83
/* write/read MMIO register */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    84
#define RTL_W8(reg, val8)	writeb ((val8), ioaddr + (reg))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    85
#define RTL_W16(reg, val16)	writew ((val16), ioaddr + (reg))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
#define RTL_W32(reg, val32)	writel ((val32), ioaddr + (reg))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    87
#define RTL_R8(reg)		readb (ioaddr + (reg))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    88
#define RTL_R16(reg)		readw (ioaddr + (reg))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
#define RTL_R32(reg)		((unsigned long) readl (ioaddr + (reg)))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    90
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    91
enum mac_version {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
	RTL_GIGA_MAC_NONE   = 0x00,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    93
	RTL_GIGA_MAC_VER_01 = 0x01, // 8169
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    94
	RTL_GIGA_MAC_VER_02 = 0x02, // 8169S
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    95
	RTL_GIGA_MAC_VER_03 = 0x03, // 8110S
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
	RTL_GIGA_MAC_VER_04 = 0x04, // 8169SB
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    97
	RTL_GIGA_MAC_VER_05 = 0x05, // 8110SCd
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    98
	RTL_GIGA_MAC_VER_06 = 0x06, // 8110SCe
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    99
	RTL_GIGA_MAC_VER_07 = 0x07, // 8102e
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   100
	RTL_GIGA_MAC_VER_08 = 0x08, // 8102e
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   101
	RTL_GIGA_MAC_VER_09 = 0x09, // 8102e
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   102
	RTL_GIGA_MAC_VER_10 = 0x0a, // 8101e
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   103
	RTL_GIGA_MAC_VER_11 = 0x0b, // 8168Bb
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   104
	RTL_GIGA_MAC_VER_12 = 0x0c, // 8168Be
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   105
	RTL_GIGA_MAC_VER_13 = 0x0d, // 8101Eb
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   106
	RTL_GIGA_MAC_VER_14 = 0x0e, // 8101 ?
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   107
	RTL_GIGA_MAC_VER_15 = 0x0f, // 8101 ?
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   108
	RTL_GIGA_MAC_VER_16 = 0x11, // 8101Ec
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   109
	RTL_GIGA_MAC_VER_17 = 0x10, // 8168Bf
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   110
	RTL_GIGA_MAC_VER_18 = 0x12, // 8168CP
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   111
	RTL_GIGA_MAC_VER_19 = 0x13, // 8168C
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   112
	RTL_GIGA_MAC_VER_20 = 0x14  // 8168C
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   113
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   114
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   115
#define _R(NAME,MAC,MASK) \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
	{ .name = NAME, .mac_version = MAC, .RxConfigMask = MASK }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   118
static const struct {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
	const char *name;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
	u8 mac_version;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   121
	u32 RxConfigMask;	/* Clears the bits supported by this chip */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
} rtl_chip_info[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   123
	_R("RTL8169",		RTL_GIGA_MAC_VER_01, 0xff7e1880), // 8169
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   124
	_R("RTL8169s",		RTL_GIGA_MAC_VER_02, 0xff7e1880), // 8169S
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
	_R("RTL8110s",		RTL_GIGA_MAC_VER_03, 0xff7e1880), // 8110S
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   126
	_R("RTL8169sb/8110sb",	RTL_GIGA_MAC_VER_04, 0xff7e1880), // 8169SB
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   127
	_R("RTL8169sc/8110sc",	RTL_GIGA_MAC_VER_05, 0xff7e1880), // 8110SCd
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   128
	_R("RTL8169sc/8110sc",	RTL_GIGA_MAC_VER_06, 0xff7e1880), // 8110SCe
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   129
	_R("RTL8102e",		RTL_GIGA_MAC_VER_07, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   130
	_R("RTL8102e",		RTL_GIGA_MAC_VER_08, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   131
	_R("RTL8102e",		RTL_GIGA_MAC_VER_09, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   132
	_R("RTL8101e",		RTL_GIGA_MAC_VER_10, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   133
	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_11, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   134
	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_12, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   135
	_R("RTL8101e",		RTL_GIGA_MAC_VER_13, 0xff7e1880), // PCI-E 8139
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   136
	_R("RTL8100e",		RTL_GIGA_MAC_VER_14, 0xff7e1880), // PCI-E 8139
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   137
	_R("RTL8100e",		RTL_GIGA_MAC_VER_15, 0xff7e1880), // PCI-E 8139
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   138
	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_17, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   139
	_R("RTL8101e",		RTL_GIGA_MAC_VER_16, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   140
	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_18, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   141
	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_19, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   142
	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_20, 0xff7e1880)  // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   143
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   144
#undef _R
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   145
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   146
enum cfg_version {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   147
	RTL_CFG_0 = 0x00,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   148
	RTL_CFG_1,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   149
	RTL_CFG_2
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   150
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   151
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   152
static void rtl_hw_start_8169(struct net_device *);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   153
static void rtl_hw_start_8168(struct net_device *);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   154
static void rtl_hw_start_8101(struct net_device *);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   155
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   156
static struct pci_device_id rtl8169_pci_tbl[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   157
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8129), 0, 0, RTL_CFG_0 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   158
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8136), 0, 0, RTL_CFG_2 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   159
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8167), 0, 0, RTL_CFG_0 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   160
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8168), 0, 0, RTL_CFG_1 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   161
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8169), 0, 0, RTL_CFG_0 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   162
	{ PCI_DEVICE(PCI_VENDOR_ID_DLINK,	0x4300), 0, 0, RTL_CFG_0 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   163
	{ PCI_DEVICE(PCI_VENDOR_ID_AT,		0xc107), 0, 0, RTL_CFG_0 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   164
	{ PCI_DEVICE(0x16ec,			0x0116), 0, 0, RTL_CFG_0 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   165
	{ PCI_VENDOR_ID_LINKSYS,		0x1032,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
		PCI_ANY_ID, 0x0024, 0, 0, RTL_CFG_0 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   167
	{ 0x0001,				0x8168,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
		PCI_ANY_ID, 0x2410, 0, 0, RTL_CFG_2 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   169
	{0,},
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   170
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   171
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   172
MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   173
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   174
static int rx_copybreak = 200;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   175
static int use_dac;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   176
static struct {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   177
	u32 msg_enable;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   178
} debug = { -1 };
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   179
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   180
enum rtl_registers {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   181
	MAC0		= 0,	/* Ethernet hardware address. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   182
	MAC4		= 4,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   183
	MAR0		= 8,	/* Multicast filter. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   184
	CounterAddrLow		= 0x10,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   185
	CounterAddrHigh		= 0x14,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
	TxDescStartAddrLow	= 0x20,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   187
	TxDescStartAddrHigh	= 0x24,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   188
	TxHDescStartAddrLow	= 0x28,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   189
	TxHDescStartAddrHigh	= 0x2c,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   190
	FLASH		= 0x30,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   191
	ERSR		= 0x36,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   192
	ChipCmd		= 0x37,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
	TxPoll		= 0x38,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   194
	IntrMask	= 0x3c,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   195
	IntrStatus	= 0x3e,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
	TxConfig	= 0x40,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
	RxConfig	= 0x44,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   198
	RxMissed	= 0x4c,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
	Cfg9346		= 0x50,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   200
	Config0		= 0x51,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   201
	Config1		= 0x52,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   202
	Config2		= 0x53,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   203
	Config3		= 0x54,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   204
	Config4		= 0x55,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   205
	Config5		= 0x56,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   206
	MultiIntr	= 0x5c,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   207
	PHYAR		= 0x60,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   208
	PHYstatus	= 0x6c,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   209
	RxMaxSize	= 0xda,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   210
	CPlusCmd	= 0xe0,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   211
	IntrMitigate	= 0xe2,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   212
	RxDescAddrLow	= 0xe4,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   213
	RxDescAddrHigh	= 0xe8,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   214
	EarlyTxThres	= 0xec,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   215
	FuncEvent	= 0xf0,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   216
	FuncEventMask	= 0xf4,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   217
	FuncPresetState	= 0xf8,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   218
	FuncForceEvent	= 0xfc,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   219
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   220
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   221
enum rtl8110_registers {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   222
	TBICSR			= 0x64,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   223
	TBI_ANAR		= 0x68,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   224
	TBI_LPAR		= 0x6a,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   225
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   226
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   227
enum rtl8168_8101_registers {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   228
	CSIDR			= 0x64,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   229
	CSIAR			= 0x68,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   230
#define	CSIAR_FLAG			0x80000000
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   231
#define	CSIAR_WRITE_CMD			0x80000000
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   232
#define	CSIAR_BYTE_ENABLE		0x0f
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   233
#define	CSIAR_BYTE_ENABLE_SHIFT		12
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   234
#define	CSIAR_ADDR_MASK			0x0fff
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   235
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   236
	EPHYAR			= 0x80,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   237
#define	EPHYAR_FLAG			0x80000000
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   238
#define	EPHYAR_WRITE_CMD		0x80000000
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   239
#define	EPHYAR_REG_MASK			0x1f
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   240
#define	EPHYAR_REG_SHIFT		16
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   241
#define	EPHYAR_DATA_MASK		0xffff
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   242
	DBG_REG			= 0xd1,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   243
#define	FIX_NAK_1			(1 << 4)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   244
#define	FIX_NAK_2			(1 << 3)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   245
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   246
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   247
enum rtl_register_content {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   248
	/* InterruptStatusBits */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
	SYSErr		= 0x8000,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   250
	PCSTimeout	= 0x4000,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   251
	SWInt		= 0x0100,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   252
	TxDescUnavail	= 0x0080,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   253
	RxFIFOOver	= 0x0040,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   254
	LinkChg		= 0x0020,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   255
	RxOverflow	= 0x0010,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   256
	TxErr		= 0x0008,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   257
	TxOK		= 0x0004,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   258
	RxErr		= 0x0002,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   259
	RxOK		= 0x0001,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   260
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
	/* RxStatusDesc */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
	RxFOVF	= (1 << 23),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
	RxRWT	= (1 << 22),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   264
	RxRES	= (1 << 21),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   265
	RxRUNT	= (1 << 20),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   266
	RxCRC	= (1 << 19),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   267
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   268
	/* ChipCmdBits */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   269
	CmdReset	= 0x10,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   270
	CmdRxEnb	= 0x08,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   271
	CmdTxEnb	= 0x04,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   272
	RxBufEmpty	= 0x01,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   273
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
	/* TXPoll register p.5 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   275
	HPQ		= 0x80,		/* Poll cmd on the high prio queue */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   276
	NPQ		= 0x40,		/* Poll cmd on the low prio queue */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
	FSWInt		= 0x01,		/* Forced software interrupt */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
	/* Cfg9346Bits */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   280
	Cfg9346_Lock	= 0x00,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   281
	Cfg9346_Unlock	= 0xc0,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   282
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   283
	/* rx_mode_bits */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   284
	AcceptErr	= 0x20,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   285
	AcceptRunt	= 0x10,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   286
	AcceptBroadcast	= 0x08,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   287
	AcceptMulticast	= 0x04,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   288
	AcceptMyPhys	= 0x02,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   289
	AcceptAllPhys	= 0x01,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   290
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   291
	/* RxConfigBits */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   292
	RxCfgFIFOShift	= 13,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   293
	RxCfgDMAShift	=  8,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   294
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   295
	/* TxConfigBits */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   296
	TxInterFrameGapShift = 24,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   297
	TxDMAShift = 8,	/* DMA burst value (0-7) is shift this many bits */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   298
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   299
	/* Config1 register p.24 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   300
	LEDS1		= (1 << 7),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   301
	LEDS0		= (1 << 6),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   302
	MSIEnable	= (1 << 5),	/* Enable Message Signaled Interrupt */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   303
	Speed_down	= (1 << 4),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   304
	MEMMAP		= (1 << 3),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   305
	IOMAP		= (1 << 2),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   306
	VPD		= (1 << 1),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   307
	PMEnable	= (1 << 0),	/* Power Management Enable */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   308
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   309
	/* Config2 register p. 25 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   310
	PCI_Clock_66MHz = 0x01,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   311
	PCI_Clock_33MHz = 0x00,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   312
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   313
	/* Config3 register p.25 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   314
	MagicPacket	= (1 << 5),	/* Wake up when receives a Magic Packet */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   315
	LinkUp		= (1 << 4),	/* Wake up when the cable connection is re-established */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   316
	Beacon_en	= (1 << 0),	/* 8168 only. Reserved in the 8168b */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   317
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   318
	/* Config5 register p.27 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   319
	BWF		= (1 << 6),	/* Accept Broadcast wakeup frame */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   320
	MWF		= (1 << 5),	/* Accept Multicast wakeup frame */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   321
	UWF		= (1 << 4),	/* Accept Unicast wakeup frame */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   322
	LanWake		= (1 << 1),	/* LanWake enable/disable */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   323
	PMEStatus	= (1 << 0),	/* PME status can be reset by PCI RST# */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   324
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   325
	/* TBICSR p.28 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   326
	TBIReset	= 0x80000000,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   327
	TBILoopback	= 0x40000000,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   328
	TBINwEnable	= 0x20000000,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   329
	TBINwRestart	= 0x10000000,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   330
	TBILinkOk	= 0x02000000,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   331
	TBINwComplete	= 0x01000000,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   332
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   333
	/* CPlusCmd p.31 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   334
	EnableBist	= (1 << 15),	// 8168 8101
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   335
	Mac_dbgo_oe	= (1 << 14),	// 8168 8101
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   336
	Normal_mode	= (1 << 13),	// unused
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   337
	Force_half_dup	= (1 << 12),	// 8168 8101
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   338
	Force_rxflow_en	= (1 << 11),	// 8168 8101
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   339
	Force_txflow_en	= (1 << 10),	// 8168 8101
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   340
	Cxpl_dbg_sel	= (1 << 9),	// 8168 8101
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   341
	ASF		= (1 << 8),	// 8168 8101
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   342
	PktCntrDisable	= (1 << 7),	// 8168 8101
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   343
	Mac_dbgo_sel	= 0x001c,	// 8168
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   344
	RxVlan		= (1 << 6),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   345
	RxChkSum	= (1 << 5),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   346
	PCIDAC		= (1 << 4),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   347
	PCIMulRW	= (1 << 3),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   348
	INTT_0		= 0x0000,	// 8168
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   349
	INTT_1		= 0x0001,	// 8168
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   350
	INTT_2		= 0x0002,	// 8168
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
	INTT_3		= 0x0003,	// 8168
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   352
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   353
	/* rtl8169_PHYstatus */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   354
	TBI_Enable	= 0x80,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   355
	TxFlowCtrl	= 0x40,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
	RxFlowCtrl	= 0x20,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
	_1000bpsF	= 0x10,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   358
	_100bps		= 0x08,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
	_10bps		= 0x04,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
	LinkStatus	= 0x02,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   361
	FullDup		= 0x01,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   363
	/* _TBICSRBit */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
	TBILinkOK	= 0x02000000,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   365
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   366
	/* DumpCounterCommand */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   367
	CounterDump	= 0x8,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   368
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   369
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
enum desc_status_bit {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   371
	DescOwn		= (1 << 31), /* Descriptor is owned by NIC */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
	RingEnd		= (1 << 30), /* End of descriptor ring */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
	FirstFrag	= (1 << 29), /* First segment of a packet */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   374
	LastFrag	= (1 << 28), /* Final segment of a packet */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   375
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
	/* Tx private */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
	LargeSend	= (1 << 27), /* TCP Large Send Offload (TSO) */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   378
	MSSShift	= 16,        /* MSS value position */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   379
	MSSMask		= 0xfff,     /* MSS value + LargeSend bit: 12 bits */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
	IPCS		= (1 << 18), /* Calculate IP checksum */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
	UDPCS		= (1 << 17), /* Calculate UDP/IP checksum */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   382
	TCPCS		= (1 << 16), /* Calculate TCP/IP checksum */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   383
	TxVlanTag	= (1 << 17), /* Add VLAN tag */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   384
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   385
	/* Rx private */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   386
	PID1		= (1 << 18), /* Protocol ID bit 1/2 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   387
	PID0		= (1 << 17), /* Protocol ID bit 2/2 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   388
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   389
#define RxProtoUDP	(PID1)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   390
#define RxProtoTCP	(PID0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
#define RxProtoIP	(PID1 | PID0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   392
#define RxProtoMask	RxProtoIP
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   393
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   394
	IPFail		= (1 << 16), /* IP checksum failed */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   395
	UDPFail		= (1 << 15), /* UDP/IP checksum failed */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   396
	TCPFail		= (1 << 14), /* TCP/IP checksum failed */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   397
	RxVlanTag	= (1 << 16), /* VLAN tag available */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   398
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   400
#define RsvdMask	0x3fffc000
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   401
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   402
struct TxDesc {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   403
	__le32 opts1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   404
	__le32 opts2;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
	__le64 addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   406
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   407
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   408
struct RxDesc {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   409
	__le32 opts1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   410
	__le32 opts2;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   411
	__le64 addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   412
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   413
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   414
struct ring_info {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   415
	struct sk_buff	*skb;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   416
	u32		len;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   417
	u8		__pad[sizeof(void *) - sizeof(u32)];
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   418
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   419
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   420
enum features {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   421
	RTL_FEATURE_WOL		= (1 << 0),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   422
	RTL_FEATURE_MSI		= (1 << 1),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   423
	RTL_FEATURE_GMII	= (1 << 2),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   424
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   425
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   426
struct rtl8169_counters {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   427
	__le64	tx_packets;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   428
	__le64	rx_packets;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   429
	__le64	tx_errors;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   430
	__le32	rx_errors;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   431
	__le16	rx_missed;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   432
	__le16	align_errors;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   433
	__le32	tx_one_collision;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   434
	__le32	tx_multi_collision;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   435
	__le64	rx_unicast;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   436
	__le64	rx_broadcast;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   437
	__le32	rx_multicast;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   438
	__le16	tx_aborted;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   439
	__le16	tx_underun;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   440
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   441
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   442
struct rtl8169_private {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   443
	void __iomem *mmio_addr;	/* memory map physical address */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   444
	struct pci_dev *pci_dev;	/* Index of PCI device */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   445
	struct net_device *dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   446
	struct napi_struct napi;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   447
	spinlock_t lock;		/* spin lock flag */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   448
	u32 msg_enable;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   449
	int chipset;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   450
	int mac_version;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   451
	u32 cur_rx; /* Index into the Rx descriptor buffer of next Rx pkt. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   452
	u32 cur_tx; /* Index into the Tx descriptor buffer of next Rx pkt. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   453
	u32 dirty_rx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   454
	u32 dirty_tx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   455
	struct TxDesc *TxDescArray;	/* 256-aligned Tx descriptor ring */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   456
	struct RxDesc *RxDescArray;	/* 256-aligned Rx descriptor ring */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   457
	dma_addr_t TxPhyAddr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   458
	dma_addr_t RxPhyAddr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
	struct sk_buff *Rx_skbuff[NUM_RX_DESC];	/* Rx data buffers */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   460
	struct ring_info tx_skb[NUM_TX_DESC];	/* Tx data buffers */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   461
	unsigned align;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   462
	unsigned rx_buf_sz;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   463
	struct timer_list timer;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   464
	u16 cp_cmd;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   465
	u16 intr_event;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   466
	u16 napi_event;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   467
	u16 intr_mask;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   468
	int phy_auto_nego_reg;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   469
	int phy_1000_ctrl_reg;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   470
#ifdef CONFIG_R8169_VLAN
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   471
	struct vlan_group *vlgrp;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   472
#endif
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   473
	int (*set_speed)(struct net_device *, u8 autoneg, u16 speed, u8 duplex);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   474
	int (*get_settings)(struct net_device *, struct ethtool_cmd *);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   475
	void (*phy_reset_enable)(void __iomem *);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   476
	void (*hw_start)(struct net_device *);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   477
	unsigned int (*phy_reset_pending)(void __iomem *);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   478
	unsigned int (*link_ok)(void __iomem *);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   479
	int pcie_cap;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   480
	struct delayed_work task;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   481
	unsigned features;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   482
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   483
	struct mii_if_info mii;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   484
	struct rtl8169_counters counters;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   485
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   486
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   487
MODULE_AUTHOR("Realtek and the Linux r8169 crew <netdev@vger.kernel.org>");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   488
MODULE_DESCRIPTION("RealTek RTL-8169 Gigabit Ethernet driver");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   489
module_param(rx_copybreak, int, 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   490
MODULE_PARM_DESC(rx_copybreak, "Copy breakpoint for copy-only-tiny-frames");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   491
module_param(use_dac, int, 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   492
MODULE_PARM_DESC(use_dac, "Enable PCI DAC. Unsafe on 32 bit PCI slot.");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   493
module_param_named(debug, debug.msg_enable, int, 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   494
MODULE_PARM_DESC(debug, "Debug verbosity level (0=none, ..., 16=all)");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   495
MODULE_LICENSE("GPL");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   496
MODULE_VERSION(RTL8169_VERSION);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   497
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   498
static int rtl8169_open(struct net_device *dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   499
static int rtl8169_start_xmit(struct sk_buff *skb, struct net_device *dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   500
static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   501
static int rtl8169_init_ring(struct net_device *dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   502
static void rtl_hw_start(struct net_device *dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   503
static int rtl8169_close(struct net_device *dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   504
static void rtl_set_rx_mode(struct net_device *dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   505
static void rtl8169_tx_timeout(struct net_device *dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   506
static struct net_device_stats *rtl8169_get_stats(struct net_device *dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   507
static int rtl8169_rx_interrupt(struct net_device *, struct rtl8169_private *,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   508
				void __iomem *, u32 budget);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   509
static int rtl8169_change_mtu(struct net_device *dev, int new_mtu);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   510
static void rtl8169_down(struct net_device *dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   511
static void rtl8169_rx_clear(struct rtl8169_private *tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   512
static int rtl8169_poll(struct napi_struct *napi, int budget);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   513
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   514
static const unsigned int rtl8169_rx_config =
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   515
	(RX_FIFO_THRESH << RxCfgFIFOShift) | (RX_DMA_BURST << RxCfgDMAShift);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   516
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   517
static void mdio_write(void __iomem *ioaddr, int reg_addr, int value)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   518
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   519
	int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   520
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   521
	RTL_W32(PHYAR, 0x80000000 | (reg_addr & 0x1f) << 16 | (value & 0xffff));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   522
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   523
	for (i = 20; i > 0; i--) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   524
		/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   525
		 * Check if the RTL8169 has completed writing to the specified
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   526
		 * MII register.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   527
		 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   528
		if (!(RTL_R32(PHYAR) & 0x80000000))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   529
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   530
		udelay(25);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   531
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   532
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   533
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   534
static int mdio_read(void __iomem *ioaddr, int reg_addr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   535
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   536
	int i, value = -1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   537
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   538
	RTL_W32(PHYAR, 0x0 | (reg_addr & 0x1f) << 16);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   539
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   540
	for (i = 20; i > 0; i--) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   541
		/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   542
		 * Check if the RTL8169 has completed retrieving data from
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   543
		 * the specified MII register.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   544
		 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   545
		if (RTL_R32(PHYAR) & 0x80000000) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   546
			value = RTL_R32(PHYAR) & 0xffff;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   547
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   548
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   549
		udelay(25);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   550
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   551
	return value;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   552
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   553
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   554
static void mdio_patch(void __iomem *ioaddr, int reg_addr, int value)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   555
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   556
	mdio_write(ioaddr, reg_addr, mdio_read(ioaddr, reg_addr) | value);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   557
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   558
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   559
static void rtl_mdio_write(struct net_device *dev, int phy_id, int location,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   560
			   int val)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   561
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   562
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   563
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   564
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   565
	mdio_write(ioaddr, location, val);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   566
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   567
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   568
static int rtl_mdio_read(struct net_device *dev, int phy_id, int location)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   569
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   570
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   571
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   572
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   573
	return mdio_read(ioaddr, location);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   574
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   575
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   576
static void rtl_ephy_write(void __iomem *ioaddr, int reg_addr, int value)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   577
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   578
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   579
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   580
	RTL_W32(EPHYAR, EPHYAR_WRITE_CMD | (value & EPHYAR_DATA_MASK) |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   581
		(reg_addr & EPHYAR_REG_MASK) << EPHYAR_REG_SHIFT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   582
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   583
	for (i = 0; i < 100; i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   584
		if (!(RTL_R32(EPHYAR) & EPHYAR_FLAG))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   585
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   586
		udelay(10);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   587
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   588
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   589
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   590
static u16 rtl_ephy_read(void __iomem *ioaddr, int reg_addr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   591
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   592
	u16 value = 0xffff;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   593
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   594
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   595
	RTL_W32(EPHYAR, (reg_addr & EPHYAR_REG_MASK) << EPHYAR_REG_SHIFT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   596
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   597
	for (i = 0; i < 100; i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   598
		if (RTL_R32(EPHYAR) & EPHYAR_FLAG) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   599
			value = RTL_R32(EPHYAR) & EPHYAR_DATA_MASK;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   600
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   601
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   602
		udelay(10);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   603
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   604
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   605
	return value;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   606
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   607
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   608
static void rtl_csi_write(void __iomem *ioaddr, int addr, int value)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   609
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   610
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   611
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   612
	RTL_W32(CSIDR, value);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   613
	RTL_W32(CSIAR, CSIAR_WRITE_CMD | (addr & CSIAR_ADDR_MASK) |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   614
		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   615
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   616
	for (i = 0; i < 100; i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   617
		if (!(RTL_R32(CSIAR) & CSIAR_FLAG))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   618
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   619
		udelay(10);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   620
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   621
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   622
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   623
static u32 rtl_csi_read(void __iomem *ioaddr, int addr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   624
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   625
	u32 value = ~0x00;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   626
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   627
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   628
	RTL_W32(CSIAR, (addr & CSIAR_ADDR_MASK) |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   629
		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   630
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   631
	for (i = 0; i < 100; i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   632
		if (RTL_R32(CSIAR) & CSIAR_FLAG) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   633
			value = RTL_R32(CSIDR);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   634
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   635
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   636
		udelay(10);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   637
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   638
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   639
	return value;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   640
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   641
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   642
static void rtl8169_irq_mask_and_ack(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   643
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   644
	RTL_W16(IntrMask, 0x0000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   645
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   646
	RTL_W16(IntrStatus, 0xffff);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   647
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   648
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   649
static void rtl8169_asic_down(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   650
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   651
	RTL_W8(ChipCmd, 0x00);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   652
	rtl8169_irq_mask_and_ack(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   653
	RTL_R16(CPlusCmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   654
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   655
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   656
static unsigned int rtl8169_tbi_reset_pending(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   657
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   658
	return RTL_R32(TBICSR) & TBIReset;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   659
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   660
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   661
static unsigned int rtl8169_xmii_reset_pending(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   662
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   663
	return mdio_read(ioaddr, MII_BMCR) & BMCR_RESET;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   664
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   665
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   666
static unsigned int rtl8169_tbi_link_ok(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   667
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   668
	return RTL_R32(TBICSR) & TBILinkOk;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   669
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   670
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   671
static unsigned int rtl8169_xmii_link_ok(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   672
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   673
	return RTL_R8(PHYstatus) & LinkStatus;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   674
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   675
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   676
static void rtl8169_tbi_reset_enable(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   677
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   678
	RTL_W32(TBICSR, RTL_R32(TBICSR) | TBIReset);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   679
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   680
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   681
static void rtl8169_xmii_reset_enable(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   682
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   683
	unsigned int val;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   684
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   685
	val = mdio_read(ioaddr, MII_BMCR) | BMCR_RESET;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   686
	mdio_write(ioaddr, MII_BMCR, val & 0xffff);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   687
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   688
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   689
static void rtl8169_check_link_status(struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   690
				      struct rtl8169_private *tp,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   691
				      void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   692
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   693
	unsigned long flags;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   694
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   695
	spin_lock_irqsave(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   696
	if (tp->link_ok(ioaddr)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   697
		netif_carrier_on(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   698
		if (netif_msg_ifup(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   699
			printk(KERN_INFO PFX "%s: link up\n", dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   700
	} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   701
		if (netif_msg_ifdown(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   702
			printk(KERN_INFO PFX "%s: link down\n", dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   703
		netif_carrier_off(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   704
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   705
	spin_unlock_irqrestore(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   706
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   707
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   708
static void rtl8169_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   709
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   710
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   711
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   712
	u8 options;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   713
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   714
	wol->wolopts = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   715
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   716
#define WAKE_ANY (WAKE_PHY | WAKE_MAGIC | WAKE_UCAST | WAKE_BCAST | WAKE_MCAST)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   717
	wol->supported = WAKE_ANY;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   718
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   719
	spin_lock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   720
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   721
	options = RTL_R8(Config1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   722
	if (!(options & PMEnable))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   723
		goto out_unlock;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   724
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   725
	options = RTL_R8(Config3);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   726
	if (options & LinkUp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   727
		wol->wolopts |= WAKE_PHY;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   728
	if (options & MagicPacket)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   729
		wol->wolopts |= WAKE_MAGIC;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   730
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   731
	options = RTL_R8(Config5);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   732
	if (options & UWF)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   733
		wol->wolopts |= WAKE_UCAST;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   734
	if (options & BWF)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   735
		wol->wolopts |= WAKE_BCAST;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   736
	if (options & MWF)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   737
		wol->wolopts |= WAKE_MCAST;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   738
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   739
out_unlock:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   740
	spin_unlock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   741
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   742
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   743
static int rtl8169_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   744
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   745
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   746
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   747
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   748
	static struct {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   749
		u32 opt;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   750
		u16 reg;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   751
		u8  mask;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   752
	} cfg[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   753
		{ WAKE_ANY,   Config1, PMEnable },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   754
		{ WAKE_PHY,   Config3, LinkUp },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   755
		{ WAKE_MAGIC, Config3, MagicPacket },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   756
		{ WAKE_UCAST, Config5, UWF },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   757
		{ WAKE_BCAST, Config5, BWF },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   758
		{ WAKE_MCAST, Config5, MWF },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   759
		{ WAKE_ANY,   Config5, LanWake }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   760
	};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   761
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   762
	spin_lock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   763
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   764
	RTL_W8(Cfg9346, Cfg9346_Unlock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   765
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   766
	for (i = 0; i < ARRAY_SIZE(cfg); i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   767
		u8 options = RTL_R8(cfg[i].reg) & ~cfg[i].mask;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   768
		if (wol->wolopts & cfg[i].opt)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   769
			options |= cfg[i].mask;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   770
		RTL_W8(cfg[i].reg, options);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   771
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   772
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   773
	RTL_W8(Cfg9346, Cfg9346_Lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   774
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   775
	if (wol->wolopts)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   776
		tp->features |= RTL_FEATURE_WOL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   777
	else
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   778
		tp->features &= ~RTL_FEATURE_WOL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   779
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   780
	spin_unlock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   781
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   782
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   783
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   784
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   785
static void rtl8169_get_drvinfo(struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   786
				struct ethtool_drvinfo *info)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   787
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   788
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   789
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   790
	strcpy(info->driver, MODULENAME);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   791
	strcpy(info->version, RTL8169_VERSION);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   792
	strcpy(info->bus_info, pci_name(tp->pci_dev));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   793
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   794
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   795
static int rtl8169_get_regs_len(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   796
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   797
	return R8169_REGS_SIZE;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   798
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   799
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   800
static int rtl8169_set_speed_tbi(struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   801
				 u8 autoneg, u16 speed, u8 duplex)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   802
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   803
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   804
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   805
	int ret = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   806
	u32 reg;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   807
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   808
	reg = RTL_R32(TBICSR);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   809
	if ((autoneg == AUTONEG_DISABLE) && (speed == SPEED_1000) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   810
	    (duplex == DUPLEX_FULL)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   811
		RTL_W32(TBICSR, reg & ~(TBINwEnable | TBINwRestart));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   812
	} else if (autoneg == AUTONEG_ENABLE)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   813
		RTL_W32(TBICSR, reg | TBINwEnable | TBINwRestart);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   814
	else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   815
		if (netif_msg_link(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   816
			printk(KERN_WARNING "%s: "
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   817
			       "incorrect speed setting refused in TBI mode\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   818
			       dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   819
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   820
		ret = -EOPNOTSUPP;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   821
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   822
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   823
	return ret;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   824
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   825
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   826
static int rtl8169_set_speed_xmii(struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   827
				  u8 autoneg, u16 speed, u8 duplex)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   828
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   829
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   830
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   831
	int giga_ctrl, bmcr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   832
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   833
	if (autoneg == AUTONEG_ENABLE) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   834
		int auto_nego;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   835
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   836
		auto_nego = mdio_read(ioaddr, MII_ADVERTISE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   837
		auto_nego |= (ADVERTISE_10HALF | ADVERTISE_10FULL |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   838
			      ADVERTISE_100HALF | ADVERTISE_100FULL);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   839
		auto_nego |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   840
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   841
		giga_ctrl = mdio_read(ioaddr, MII_CTRL1000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   842
		giga_ctrl &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   843
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   844
		/* The 8100e/8101e/8102e do Fast Ethernet only. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   845
		if ((tp->mac_version != RTL_GIGA_MAC_VER_07) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   846
		    (tp->mac_version != RTL_GIGA_MAC_VER_08) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   847
		    (tp->mac_version != RTL_GIGA_MAC_VER_09) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   848
		    (tp->mac_version != RTL_GIGA_MAC_VER_10) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   849
		    (tp->mac_version != RTL_GIGA_MAC_VER_13) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   850
		    (tp->mac_version != RTL_GIGA_MAC_VER_14) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   851
		    (tp->mac_version != RTL_GIGA_MAC_VER_15) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   852
		    (tp->mac_version != RTL_GIGA_MAC_VER_16)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   853
			giga_ctrl |= ADVERTISE_1000FULL | ADVERTISE_1000HALF;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   854
		} else if (netif_msg_link(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   855
			printk(KERN_INFO "%s: PHY does not support 1000Mbps.\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   856
			       dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   857
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   858
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   859
		bmcr = BMCR_ANENABLE | BMCR_ANRESTART;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   860
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   861
		if ((tp->mac_version == RTL_GIGA_MAC_VER_11) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   862
		    (tp->mac_version == RTL_GIGA_MAC_VER_12) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   863
		    (tp->mac_version >= RTL_GIGA_MAC_VER_17)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   864
			/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   865
			 * Wake up the PHY.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   866
			 * Vendor specific (0x1f) and reserved (0x0e) MII
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   867
			 * registers.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   868
			 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   869
			mdio_write(ioaddr, 0x1f, 0x0000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   870
			mdio_write(ioaddr, 0x0e, 0x0000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   871
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   872
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   873
		tp->phy_auto_nego_reg = auto_nego;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   874
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   875
		mdio_write(ioaddr, MII_ADVERTISE, auto_nego);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   876
		mdio_write(ioaddr, MII_CTRL1000, giga_ctrl);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   877
	} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   878
		giga_ctrl = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   879
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   880
		if (speed == SPEED_10)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   881
			bmcr = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   882
		else if (speed == SPEED_100)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   883
			bmcr = BMCR_SPEED100;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   884
		else
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   885
			return -EINVAL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   886
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   887
		if (duplex == DUPLEX_FULL)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   888
			bmcr |= BMCR_FULLDPLX;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   889
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   890
		mdio_write(ioaddr, 0x1f, 0x0000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   891
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   892
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   893
	tp->phy_1000_ctrl_reg = giga_ctrl;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   894
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   895
	mdio_write(ioaddr, MII_BMCR, bmcr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   896
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   897
	if ((tp->mac_version == RTL_GIGA_MAC_VER_02) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   898
	    (tp->mac_version == RTL_GIGA_MAC_VER_03)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   899
		if ((speed == SPEED_100) && (autoneg != AUTONEG_ENABLE)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   900
			mdio_write(ioaddr, 0x17, 0x2138);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   901
			mdio_write(ioaddr, 0x0e, 0x0260);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   902
		} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   903
			mdio_write(ioaddr, 0x17, 0x2108);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   904
			mdio_write(ioaddr, 0x0e, 0x0000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   905
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   906
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   907
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   908
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   909
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   910
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   911
static int rtl8169_set_speed(struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   912
			     u8 autoneg, u16 speed, u8 duplex)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   913
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   914
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   915
	int ret;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   916
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   917
	ret = tp->set_speed(dev, autoneg, speed, duplex);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   918
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   919
	if (netif_running(dev) && (tp->phy_1000_ctrl_reg & ADVERTISE_1000FULL))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   920
		mod_timer(&tp->timer, jiffies + RTL8169_PHY_TIMEOUT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   921
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   922
	return ret;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   923
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   924
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   925
static int rtl8169_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   926
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   927
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   928
	unsigned long flags;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   929
	int ret;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   930
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   931
	spin_lock_irqsave(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   932
	ret = rtl8169_set_speed(dev, cmd->autoneg, cmd->speed, cmd->duplex);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   933
	spin_unlock_irqrestore(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   934
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   935
	return ret;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   936
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   937
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   938
static u32 rtl8169_get_rx_csum(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   939
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   940
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   941
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   942
	return tp->cp_cmd & RxChkSum;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   943
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   944
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   945
static int rtl8169_set_rx_csum(struct net_device *dev, u32 data)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   946
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   947
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   948
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   949
	unsigned long flags;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   950
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   951
	spin_lock_irqsave(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   952
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   953
	if (data)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   954
		tp->cp_cmd |= RxChkSum;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   955
	else
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   956
		tp->cp_cmd &= ~RxChkSum;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   957
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   958
	RTL_W16(CPlusCmd, tp->cp_cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   959
	RTL_R16(CPlusCmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   960
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   961
	spin_unlock_irqrestore(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   962
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   963
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   964
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   965
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   966
#ifdef CONFIG_R8169_VLAN
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   967
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   968
static inline u32 rtl8169_tx_vlan_tag(struct rtl8169_private *tp,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   969
				      struct sk_buff *skb)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   970
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   971
	return (tp->vlgrp && vlan_tx_tag_present(skb)) ?
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   972
		TxVlanTag | swab16(vlan_tx_tag_get(skb)) : 0x00;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   973
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   974
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   975
static void rtl8169_vlan_rx_register(struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   976
				     struct vlan_group *grp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   977
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   978
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   979
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   980
	unsigned long flags;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   981
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   982
	spin_lock_irqsave(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   983
	tp->vlgrp = grp;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   984
	if (tp->vlgrp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   985
		tp->cp_cmd |= RxVlan;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   986
	else
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   987
		tp->cp_cmd &= ~RxVlan;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   988
	RTL_W16(CPlusCmd, tp->cp_cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   989
	RTL_R16(CPlusCmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   990
	spin_unlock_irqrestore(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   991
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   992
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   993
static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   994
			       struct sk_buff *skb)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   995
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   996
	u32 opts2 = le32_to_cpu(desc->opts2);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   997
	struct vlan_group *vlgrp = tp->vlgrp;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   998
	int ret;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   999
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1000
	if (vlgrp && (opts2 & RxVlanTag)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1001
		vlan_hwaccel_receive_skb(skb, vlgrp, swab16(opts2 & 0xffff));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1002
		ret = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1003
	} else
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1004
		ret = -1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1005
	desc->opts2 = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1006
	return ret;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1007
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1008
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1009
#else /* !CONFIG_R8169_VLAN */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1010
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1011
static inline u32 rtl8169_tx_vlan_tag(struct rtl8169_private *tp,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1012
				      struct sk_buff *skb)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1013
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1014
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1015
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1016
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1017
static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1018
			       struct sk_buff *skb)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1019
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1020
	return -1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1021
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1022
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1023
#endif
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1024
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1025
static int rtl8169_gset_tbi(struct net_device *dev, struct ethtool_cmd *cmd)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1026
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1027
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1028
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1029
	u32 status;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1030
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1031
	cmd->supported =
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1032
		SUPPORTED_1000baseT_Full | SUPPORTED_Autoneg | SUPPORTED_FIBRE;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1033
	cmd->port = PORT_FIBRE;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1034
	cmd->transceiver = XCVR_INTERNAL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1035
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1036
	status = RTL_R32(TBICSR);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1037
	cmd->advertising = (status & TBINwEnable) ?  ADVERTISED_Autoneg : 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1038
	cmd->autoneg = !!(status & TBINwEnable);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1039
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1040
	cmd->speed = SPEED_1000;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1041
	cmd->duplex = DUPLEX_FULL; /* Always set */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1042
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1043
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1044
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1045
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1046
static int rtl8169_gset_xmii(struct net_device *dev, struct ethtool_cmd *cmd)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1047
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1048
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1049
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1050
	return mii_ethtool_gset(&tp->mii, cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1051
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1052
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1053
static int rtl8169_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1054
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1055
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1056
	unsigned long flags;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1057
	int rc;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1058
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1059
	spin_lock_irqsave(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1060
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1061
	rc = tp->get_settings(dev, cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1062
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1063
	spin_unlock_irqrestore(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1064
	return rc;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1065
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1066
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1067
static void rtl8169_get_regs(struct net_device *dev, struct ethtool_regs *regs,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1068
			     void *p)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1069
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1070
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1071
	unsigned long flags;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1072
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1073
	if (regs->len > R8169_REGS_SIZE)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1074
		regs->len = R8169_REGS_SIZE;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1075
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1076
	spin_lock_irqsave(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1077
	memcpy_fromio(p, tp->mmio_addr, regs->len);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1078
	spin_unlock_irqrestore(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1079
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1080
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1081
static u32 rtl8169_get_msglevel(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1082
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1083
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1084
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1085
	return tp->msg_enable;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1086
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1087
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1088
static void rtl8169_set_msglevel(struct net_device *dev, u32 value)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1089
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1090
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1091
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1092
	tp->msg_enable = value;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1093
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1094
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1095
static const char rtl8169_gstrings[][ETH_GSTRING_LEN] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1096
	"tx_packets",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1097
	"rx_packets",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1098
	"tx_errors",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1099
	"rx_errors",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1100
	"rx_missed",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1101
	"align_errors",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1102
	"tx_single_collisions",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1103
	"tx_multi_collisions",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1104
	"unicast",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1105
	"broadcast",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1106
	"multicast",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1107
	"tx_aborted",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1108
	"tx_underrun",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1109
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1110
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1111
static int rtl8169_get_sset_count(struct net_device *dev, int sset)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1112
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1113
	switch (sset) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1114
	case ETH_SS_STATS:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1115
		return ARRAY_SIZE(rtl8169_gstrings);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1116
	default:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1117
		return -EOPNOTSUPP;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1118
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1119
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1120
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1121
static void rtl8169_update_counters(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1122
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1123
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1124
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1125
	struct rtl8169_counters *counters;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1126
	dma_addr_t paddr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1127
	u32 cmd;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1128
	int wait = 1000;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1129
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1130
	/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1131
	 * Some chips are unable to dump tally counters when the receiver
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1132
	 * is disabled.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1133
	 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1134
	if ((RTL_R8(ChipCmd) & CmdRxEnb) == 0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1135
		return;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1136
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1137
	counters = pci_alloc_consistent(tp->pci_dev, sizeof(*counters), &paddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1138
	if (!counters)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1139
		return;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1140
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1141
	RTL_W32(CounterAddrHigh, (u64)paddr >> 32);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1142
	cmd = (u64)paddr & DMA_32BIT_MASK;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1143
	RTL_W32(CounterAddrLow, cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1144
	RTL_W32(CounterAddrLow, cmd | CounterDump);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1145
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1146
	while (wait--) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1147
		if ((RTL_R32(CounterAddrLow) & CounterDump) == 0) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1148
			/* copy updated counters */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1149
			memcpy(&tp->counters, counters, sizeof(*counters));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1150
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1151
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1152
		udelay(10);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1153
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1154
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1155
	RTL_W32(CounterAddrLow, 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1156
	RTL_W32(CounterAddrHigh, 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1157
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1158
	pci_free_consistent(tp->pci_dev, sizeof(*counters), counters, paddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1159
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1160
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1161
static void rtl8169_get_ethtool_stats(struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1162
				      struct ethtool_stats *stats, u64 *data)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1163
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1164
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1165
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1166
	ASSERT_RTNL();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1167
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1168
	rtl8169_update_counters(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1169
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1170
	data[0] = le64_to_cpu(tp->counters.tx_packets);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1171
	data[1] = le64_to_cpu(tp->counters.rx_packets);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1172
	data[2] = le64_to_cpu(tp->counters.tx_errors);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1173
	data[3] = le32_to_cpu(tp->counters.rx_errors);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1174
	data[4] = le16_to_cpu(tp->counters.rx_missed);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1175
	data[5] = le16_to_cpu(tp->counters.align_errors);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1176
	data[6] = le32_to_cpu(tp->counters.tx_one_collision);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1177
	data[7] = le32_to_cpu(tp->counters.tx_multi_collision);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1178
	data[8] = le64_to_cpu(tp->counters.rx_unicast);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1179
	data[9] = le64_to_cpu(tp->counters.rx_broadcast);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1180
	data[10] = le32_to_cpu(tp->counters.rx_multicast);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1181
	data[11] = le16_to_cpu(tp->counters.tx_aborted);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1182
	data[12] = le16_to_cpu(tp->counters.tx_underun);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1183
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1184
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1185
static void rtl8169_get_strings(struct net_device *dev, u32 stringset, u8 *data)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1186
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1187
	switch(stringset) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1188
	case ETH_SS_STATS:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1189
		memcpy(data, *rtl8169_gstrings, sizeof(rtl8169_gstrings));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1190
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1191
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1192
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1193
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1194
static const struct ethtool_ops rtl8169_ethtool_ops = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1195
	.get_drvinfo		= rtl8169_get_drvinfo,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1196
	.get_regs_len		= rtl8169_get_regs_len,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1197
	.get_link		= ethtool_op_get_link,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1198
	.get_settings		= rtl8169_get_settings,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1199
	.set_settings		= rtl8169_set_settings,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1200
	.get_msglevel		= rtl8169_get_msglevel,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1201
	.set_msglevel		= rtl8169_set_msglevel,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1202
	.get_rx_csum		= rtl8169_get_rx_csum,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1203
	.set_rx_csum		= rtl8169_set_rx_csum,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1204
	.set_tx_csum		= ethtool_op_set_tx_csum,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1205
	.set_sg			= ethtool_op_set_sg,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1206
	.set_tso		= ethtool_op_set_tso,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1207
	.get_regs		= rtl8169_get_regs,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1208
	.get_wol		= rtl8169_get_wol,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1209
	.set_wol		= rtl8169_set_wol,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1210
	.get_strings		= rtl8169_get_strings,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1211
	.get_sset_count		= rtl8169_get_sset_count,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1212
	.get_ethtool_stats	= rtl8169_get_ethtool_stats,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1213
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1214
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1215
static void rtl8169_write_gmii_reg_bit(void __iomem *ioaddr, int reg,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1216
				       int bitnum, int bitval)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1217
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1218
	int val;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1219
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1220
	val = mdio_read(ioaddr, reg);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1221
	val = (bitval == 1) ?
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1222
		val | (bitval << bitnum) :  val & ~(0x0001 << bitnum);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1223
	mdio_write(ioaddr, reg, val & 0xffff);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1224
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1225
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1226
static void rtl8169_get_mac_version(struct rtl8169_private *tp,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1227
				    void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1228
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1229
	/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1230
	 * The driver currently handles the 8168Bf and the 8168Be identically
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1231
	 * but they can be identified more specifically through the test below
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1232
	 * if needed:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1233
	 *
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1234
	 * (RTL_R32(TxConfig) & 0x700000) == 0x500000 ? 8168Bf : 8168Be
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1235
	 *
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1236
	 * Same thing for the 8101Eb and the 8101Ec:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1237
	 *
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1238
	 * (RTL_R32(TxConfig) & 0x700000) == 0x200000 ? 8101Eb : 8101Ec
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1239
	 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1240
	const struct {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1241
		u32 mask;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1242
		u32 val;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1243
		int mac_version;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1244
	} mac_info[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1245
		/* 8168B family. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1246
		{ 0x7c800000, 0x3c800000,	RTL_GIGA_MAC_VER_18 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1247
		{ 0x7cf00000, 0x3c000000,	RTL_GIGA_MAC_VER_19 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1248
		{ 0x7cf00000, 0x3c200000,	RTL_GIGA_MAC_VER_20 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1249
		{ 0x7c800000, 0x3c000000,	RTL_GIGA_MAC_VER_20 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1250
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1251
		/* 8168B family. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1252
		{ 0x7cf00000, 0x38000000,	RTL_GIGA_MAC_VER_12 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1253
		{ 0x7cf00000, 0x38500000,	RTL_GIGA_MAC_VER_17 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1254
		{ 0x7c800000, 0x38000000,	RTL_GIGA_MAC_VER_17 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1255
		{ 0x7c800000, 0x30000000,	RTL_GIGA_MAC_VER_11 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1256
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1257
		/* 8101 family. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1258
		{ 0x7cf00000, 0x34a00000,	RTL_GIGA_MAC_VER_09 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1259
		{ 0x7cf00000, 0x24a00000,	RTL_GIGA_MAC_VER_09 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1260
		{ 0x7cf00000, 0x34900000,	RTL_GIGA_MAC_VER_08 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1261
		{ 0x7cf00000, 0x24900000,	RTL_GIGA_MAC_VER_08 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1262
		{ 0x7cf00000, 0x34800000,	RTL_GIGA_MAC_VER_07 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1263
		{ 0x7cf00000, 0x24800000,	RTL_GIGA_MAC_VER_07 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1264
		{ 0x7cf00000, 0x34000000,	RTL_GIGA_MAC_VER_13 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1265
		{ 0x7cf00000, 0x34300000,	RTL_GIGA_MAC_VER_10 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1266
		{ 0x7cf00000, 0x34200000,	RTL_GIGA_MAC_VER_16 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1267
		{ 0x7c800000, 0x34800000,	RTL_GIGA_MAC_VER_09 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1268
		{ 0x7c800000, 0x24800000,	RTL_GIGA_MAC_VER_09 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1269
		{ 0x7c800000, 0x34000000,	RTL_GIGA_MAC_VER_16 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1270
		/* FIXME: where did these entries come from ? -- FR */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1271
		{ 0xfc800000, 0x38800000,	RTL_GIGA_MAC_VER_15 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1272
		{ 0xfc800000, 0x30800000,	RTL_GIGA_MAC_VER_14 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1273
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1274
		/* 8110 family. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1275
		{ 0xfc800000, 0x98000000,	RTL_GIGA_MAC_VER_06 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1276
		{ 0xfc800000, 0x18000000,	RTL_GIGA_MAC_VER_05 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1277
		{ 0xfc800000, 0x10000000,	RTL_GIGA_MAC_VER_04 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1278
		{ 0xfc800000, 0x04000000,	RTL_GIGA_MAC_VER_03 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1279
		{ 0xfc800000, 0x00800000,	RTL_GIGA_MAC_VER_02 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1280
		{ 0xfc800000, 0x00000000,	RTL_GIGA_MAC_VER_01 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1281
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1282
		/* Catch-all */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1283
		{ 0x00000000, 0x00000000,	RTL_GIGA_MAC_NONE   }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1284
	}, *p = mac_info;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1285
	u32 reg;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1286
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1287
	reg = RTL_R32(TxConfig);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1288
	while ((reg & p->mask) != p->val)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1289
		p++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1290
	tp->mac_version = p->mac_version;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1291
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1292
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1293
static void rtl8169_print_mac_version(struct rtl8169_private *tp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1294
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1295
	dprintk("mac_version = 0x%02x\n", tp->mac_version);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1296
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1297
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1298
struct phy_reg {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1299
	u16 reg;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1300
	u16 val;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1301
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1302
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1303
static void rtl_phy_write(void __iomem *ioaddr, struct phy_reg *regs, int len)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1304
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1305
	while (len-- > 0) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1306
		mdio_write(ioaddr, regs->reg, regs->val);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1307
		regs++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1308
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1309
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1310
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1311
static void rtl8169s_hw_phy_config(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1312
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1313
	struct {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1314
		u16 regs[5]; /* Beware of bit-sign propagation */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1315
	} phy_magic[5] = { {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1316
		{ 0x0000,	//w 4 15 12 0
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1317
		  0x00a1,	//w 3 15 0 00a1
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1318
		  0x0008,	//w 2 15 0 0008
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1319
		  0x1020,	//w 1 15 0 1020
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1320
		  0x1000 } },{	//w 0 15 0 1000
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1321
		{ 0x7000,	//w 4 15 12 7
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1322
		  0xff41,	//w 3 15 0 ff41
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1323
		  0xde60,	//w 2 15 0 de60
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1324
		  0x0140,	//w 1 15 0 0140
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1325
		  0x0077 } },{	//w 0 15 0 0077
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1326
		{ 0xa000,	//w 4 15 12 a
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1327
		  0xdf01,	//w 3 15 0 df01
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1328
		  0xdf20,	//w 2 15 0 df20
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1329
		  0xff95,	//w 1 15 0 ff95
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1330
		  0xfa00 } },{	//w 0 15 0 fa00
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1331
		{ 0xb000,	//w 4 15 12 b
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1332
		  0xff41,	//w 3 15 0 ff41
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1333
		  0xde20,	//w 2 15 0 de20
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1334
		  0x0140,	//w 1 15 0 0140
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1335
		  0x00bb } },{	//w 0 15 0 00bb
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1336
		{ 0xf000,	//w 4 15 12 f
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1337
		  0xdf01,	//w 3 15 0 df01
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1338
		  0xdf20,	//w 2 15 0 df20
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1339
		  0xff95,	//w 1 15 0 ff95
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1340
		  0xbf00 }	//w 0 15 0 bf00
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1341
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1342
	}, *p = phy_magic;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1343
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1344
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1345
	mdio_write(ioaddr, 0x1f, 0x0001);		//w 31 2 0 1
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1346
	mdio_write(ioaddr, 0x15, 0x1000);		//w 21 15 0 1000
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1347
	mdio_write(ioaddr, 0x18, 0x65c7);		//w 24 15 0 65c7
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1348
	rtl8169_write_gmii_reg_bit(ioaddr, 4, 11, 0);	//w 4 11 11 0
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1349
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1350
	for (i = 0; i < ARRAY_SIZE(phy_magic); i++, p++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1351
		int val, pos = 4;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1352
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1353
		val = (mdio_read(ioaddr, pos) & 0x0fff) | (p->regs[0] & 0xffff);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1354
		mdio_write(ioaddr, pos, val);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1355
		while (--pos >= 0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1356
			mdio_write(ioaddr, pos, p->regs[4 - pos] & 0xffff);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1357
		rtl8169_write_gmii_reg_bit(ioaddr, 4, 11, 1); //w 4 11 11 1
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1358
		rtl8169_write_gmii_reg_bit(ioaddr, 4, 11, 0); //w 4 11 11 0
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1359
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1360
	mdio_write(ioaddr, 0x1f, 0x0000); //w 31 2 0 0
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1361
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1362
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1363
static void rtl8169sb_hw_phy_config(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1364
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1365
	struct phy_reg phy_reg_init[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1366
		{ 0x1f, 0x0002 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1367
		{ 0x01, 0x90d0 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1368
		{ 0x1f, 0x0000 }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1369
	};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1370
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1371
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1372
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1373
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1374
static void rtl8168cp_hw_phy_config(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1375
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1376
	struct phy_reg phy_reg_init[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1377
		{ 0x1f, 0x0000 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1378
		{ 0x1d, 0x0f00 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1379
		{ 0x1f, 0x0002 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1380
		{ 0x0c, 0x1ec8 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1381
		{ 0x1f, 0x0000 }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1382
	};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1383
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1384
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1385
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1386
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1387
static void rtl8168c_hw_phy_config(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1388
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1389
	struct phy_reg phy_reg_init[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1390
		{ 0x1f, 0x0001 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1391
		{ 0x12, 0x2300 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1392
		{ 0x1f, 0x0002 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1393
		{ 0x00, 0x88d4 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1394
		{ 0x01, 0x82b1 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1395
		{ 0x03, 0x7002 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1396
		{ 0x08, 0x9e30 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1397
		{ 0x09, 0x01f0 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1398
		{ 0x0a, 0x5500 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1399
		{ 0x0c, 0x00c8 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1400
		{ 0x1f, 0x0003 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1401
		{ 0x12, 0xc096 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1402
		{ 0x16, 0x000a },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1403
		{ 0x1f, 0x0000 }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1404
	};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1405
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1406
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1407
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1408
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1409
static void rtl8168cx_hw_phy_config(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1410
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1411
	struct phy_reg phy_reg_init[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1412
		{ 0x1f, 0x0000 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1413
		{ 0x12, 0x2300 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1414
		{ 0x1f, 0x0003 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1415
		{ 0x16, 0x0f0a },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1416
		{ 0x1f, 0x0000 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1417
		{ 0x1f, 0x0002 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1418
		{ 0x0c, 0x7eb8 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1419
		{ 0x1f, 0x0000 }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1420
	};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1421
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1422
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1423
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1424
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1425
static void rtl8102e_hw_phy_config(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1426
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1427
	struct phy_reg phy_reg_init[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1428
		{ 0x1f, 0x0003 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1429
		{ 0x08, 0x441d },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1430
		{ 0x01, 0x9100 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1431
		{ 0x1f, 0x0000 }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1432
	};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1433
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1434
	mdio_write(ioaddr, 0x1f, 0x0000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1435
	mdio_patch(ioaddr, 0x11, 1 << 12);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1436
	mdio_patch(ioaddr, 0x19, 1 << 13);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1437
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1438
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1439
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1440
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1441
static void rtl_hw_phy_config(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1442
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1443
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1444
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1445
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1446
	rtl8169_print_mac_version(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1447
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1448
	switch (tp->mac_version) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1449
	case RTL_GIGA_MAC_VER_01:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1450
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1451
	case RTL_GIGA_MAC_VER_02:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1452
	case RTL_GIGA_MAC_VER_03:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1453
		rtl8169s_hw_phy_config(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1454
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1455
	case RTL_GIGA_MAC_VER_04:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1456
		rtl8169sb_hw_phy_config(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1457
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1458
	case RTL_GIGA_MAC_VER_07:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1459
	case RTL_GIGA_MAC_VER_08:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1460
	case RTL_GIGA_MAC_VER_09:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1461
		rtl8102e_hw_phy_config(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1462
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1463
	case RTL_GIGA_MAC_VER_18:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1464
		rtl8168cp_hw_phy_config(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1465
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1466
	case RTL_GIGA_MAC_VER_19:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1467
		rtl8168c_hw_phy_config(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1468
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1469
	case RTL_GIGA_MAC_VER_20:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1470
		rtl8168cx_hw_phy_config(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1471
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1472
	default:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1473
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1474
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1475
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1476
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1477
static void rtl8169_phy_timer(unsigned long __opaque)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1478
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1479
	struct net_device *dev = (struct net_device *)__opaque;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1480
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1481
	struct timer_list *timer = &tp->timer;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1482
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1483
	unsigned long timeout = RTL8169_PHY_TIMEOUT;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1484
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1485
	assert(tp->mac_version > RTL_GIGA_MAC_VER_01);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1486
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1487
	if (!(tp->phy_1000_ctrl_reg & ADVERTISE_1000FULL))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1488
		return;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1489
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1490
	spin_lock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1491
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1492
	if (tp->phy_reset_pending(ioaddr)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1493
		/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1494
		 * A busy loop could burn quite a few cycles on nowadays CPU.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1495
		 * Let's delay the execution of the timer for a few ticks.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1496
		 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1497
		timeout = HZ/10;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1498
		goto out_mod_timer;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1499
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1500
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1501
	if (tp->link_ok(ioaddr))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1502
		goto out_unlock;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1503
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1504
	if (netif_msg_link(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1505
		printk(KERN_WARNING "%s: PHY reset until link up\n", dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1506
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1507
	tp->phy_reset_enable(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1508
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1509
out_mod_timer:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1510
	mod_timer(timer, jiffies + timeout);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1511
out_unlock:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1512
	spin_unlock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1513
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1514
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1515
static inline void rtl8169_delete_timer(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1516
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1517
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1518
	struct timer_list *timer = &tp->timer;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1519
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1520
	if (tp->mac_version <= RTL_GIGA_MAC_VER_01)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1521
		return;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1522
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1523
	del_timer_sync(timer);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1524
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1525
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1526
static inline void rtl8169_request_timer(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1527
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1528
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1529
	struct timer_list *timer = &tp->timer;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1530
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1531
	if (tp->mac_version <= RTL_GIGA_MAC_VER_01)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1532
		return;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1533
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1534
	mod_timer(timer, jiffies + RTL8169_PHY_TIMEOUT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1535
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1536
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1537
#ifdef CONFIG_NET_POLL_CONTROLLER
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1538
/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1539
 * Polling 'interrupt' - used by things like netconsole to send skbs
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1540
 * without having to re-enable interrupts. It's not called while
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1541
 * the interrupt routine is executing.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1542
 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1543
static void rtl8169_netpoll(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1544
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1545
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1546
	struct pci_dev *pdev = tp->pci_dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1547
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1548
	disable_irq(pdev->irq);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1549
	rtl8169_interrupt(pdev->irq, dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1550
	enable_irq(pdev->irq);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1551
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1552
#endif
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1553
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1554
static void rtl8169_release_board(struct pci_dev *pdev, struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1555
				  void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1556
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1557
	iounmap(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1558
	pci_release_regions(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1559
	pci_disable_device(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1560
	free_netdev(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1561
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1562
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1563
static void rtl8169_phy_reset(struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1564
			      struct rtl8169_private *tp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1565
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1566
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1567
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1568
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1569
	tp->phy_reset_enable(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1570
	for (i = 0; i < 100; i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1571
		if (!tp->phy_reset_pending(ioaddr))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1572
			return;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1573
		msleep(1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1574
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1575
	if (netif_msg_link(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1576
		printk(KERN_ERR "%s: PHY reset failed.\n", dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1577
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1578
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1579
static void rtl8169_init_phy(struct net_device *dev, struct rtl8169_private *tp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1580
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1581
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1582
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1583
	rtl_hw_phy_config(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1584
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1585
	if (tp->mac_version <= RTL_GIGA_MAC_VER_06) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1586
		dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1587
		RTL_W8(0x82, 0x01);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1588
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1589
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1590
	pci_write_config_byte(tp->pci_dev, PCI_LATENCY_TIMER, 0x40);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1591
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1592
	if (tp->mac_version <= RTL_GIGA_MAC_VER_06)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1593
		pci_write_config_byte(tp->pci_dev, PCI_CACHE_LINE_SIZE, 0x08);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1594
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1595
	if (tp->mac_version == RTL_GIGA_MAC_VER_02) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1596
		dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1597
		RTL_W8(0x82, 0x01);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1598
		dprintk("Set PHY Reg 0x0bh = 0x00h\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1599
		mdio_write(ioaddr, 0x0b, 0x0000); //w 0x0b 15 0 0
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1600
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1601
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1602
	rtl8169_phy_reset(dev, tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1603
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1604
	/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1605
	 * rtl8169_set_speed_xmii takes good care of the Fast Ethernet
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1606
	 * only 8101. Don't panic.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1607
	 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1608
	rtl8169_set_speed(dev, AUTONEG_ENABLE, SPEED_1000, DUPLEX_FULL);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1609
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1610
	if ((RTL_R8(PHYstatus) & TBI_Enable) && netif_msg_link(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1611
		printk(KERN_INFO PFX "%s: TBI auto-negotiating\n", dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1612
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1613
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1614
static void rtl_rar_set(struct rtl8169_private *tp, u8 *addr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1615
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1616
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1617
	u32 high;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1618
	u32 low;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1619
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1620
	low  = addr[0] | (addr[1] << 8) | (addr[2] << 16) | (addr[3] << 24);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1621
	high = addr[4] | (addr[5] << 8);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1622
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1623
	spin_lock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1624
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1625
	RTL_W8(Cfg9346, Cfg9346_Unlock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1626
	RTL_W32(MAC0, low);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1627
	RTL_W32(MAC4, high);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1628
	RTL_W8(Cfg9346, Cfg9346_Lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1629
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1630
	spin_unlock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1631
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1632
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1633
static int rtl_set_mac_address(struct net_device *dev, void *p)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1634
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1635
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1636
	struct sockaddr *addr = p;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1637
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1638
	if (!is_valid_ether_addr(addr->sa_data))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1639
		return -EADDRNOTAVAIL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1640
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1641
	memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1642
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1643
	rtl_rar_set(tp, dev->dev_addr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1644
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1645
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1646
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1647
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1648
static int rtl8169_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1649
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1650
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1651
	struct mii_ioctl_data *data = if_mii(ifr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1652
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1653
	if (!netif_running(dev))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1654
		return -ENODEV;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1655
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1656
	switch (cmd) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1657
	case SIOCGMIIPHY:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1658
		data->phy_id = 32; /* Internal PHY */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1659
		return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1660
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1661
	case SIOCGMIIREG:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1662
		data->val_out = mdio_read(tp->mmio_addr, data->reg_num & 0x1f);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1663
		return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1664
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1665
	case SIOCSMIIREG:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1666
		if (!capable(CAP_NET_ADMIN))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1667
			return -EPERM;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1668
		mdio_write(tp->mmio_addr, data->reg_num & 0x1f, data->val_in);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1669
		return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1670
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1671
	return -EOPNOTSUPP;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1672
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1673
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1674
static const struct rtl_cfg_info {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1675
	void (*hw_start)(struct net_device *);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1676
	unsigned int region;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1677
	unsigned int align;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1678
	u16 intr_event;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1679
	u16 napi_event;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1680
	unsigned features;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1681
	u8 default_ver;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1682
} rtl_cfg_infos [] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1683
	[RTL_CFG_0] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1684
		.hw_start	= rtl_hw_start_8169,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1685
		.region		= 1,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1686
		.align		= 0,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1687
		.intr_event	= SYSErr | LinkChg | RxOverflow |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1688
				  RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1689
		.napi_event	= RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1690
		.features	= RTL_FEATURE_GMII,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1691
		.default_ver	= RTL_GIGA_MAC_VER_01,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1692
	},
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1693
	[RTL_CFG_1] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1694
		.hw_start	= rtl_hw_start_8168,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1695
		.region		= 2,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1696
		.align		= 8,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1697
		.intr_event	= SYSErr | LinkChg | RxOverflow |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1698
				  TxErr | TxOK | RxOK | RxErr,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1699
		.napi_event	= TxErr | TxOK | RxOK | RxOverflow,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1700
		.features	= RTL_FEATURE_GMII | RTL_FEATURE_MSI,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1701
		.default_ver	= RTL_GIGA_MAC_VER_11,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1702
	},
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1703
	[RTL_CFG_2] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1704
		.hw_start	= rtl_hw_start_8101,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1705
		.region		= 2,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1706
		.align		= 8,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1707
		.intr_event	= SYSErr | LinkChg | RxOverflow | PCSTimeout |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1708
				  RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1709
		.napi_event	= RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1710
		.features	= RTL_FEATURE_MSI,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1711
		.default_ver	= RTL_GIGA_MAC_VER_13,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1712
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1713
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1714
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1715
/* Cfg9346_Unlock assumed. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1716
static unsigned rtl_try_msi(struct pci_dev *pdev, void __iomem *ioaddr,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1717
			    const struct rtl_cfg_info *cfg)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1718
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1719
	unsigned msi = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1720
	u8 cfg2;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1721
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1722
	cfg2 = RTL_R8(Config2) & ~MSIEnable;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1723
	if (cfg->features & RTL_FEATURE_MSI) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1724
		if (pci_enable_msi(pdev)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1725
			dev_info(&pdev->dev, "no MSI. Back to INTx.\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1726
		} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1727
			cfg2 |= MSIEnable;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1728
			msi = RTL_FEATURE_MSI;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1729
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1730
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1731
	RTL_W8(Config2, cfg2);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1732
	return msi;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1733
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1734
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1735
static void rtl_disable_msi(struct pci_dev *pdev, struct rtl8169_private *tp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1736
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1737
	if (tp->features & RTL_FEATURE_MSI) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1738
		pci_disable_msi(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1739
		tp->features &= ~RTL_FEATURE_MSI;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1740
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1741
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1742
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1743
static int __devinit
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1744
rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1745
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1746
	const struct rtl_cfg_info *cfg = rtl_cfg_infos + ent->driver_data;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1747
	const unsigned int region = cfg->region;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1748
	struct rtl8169_private *tp;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1749
	struct mii_if_info *mii;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1750
	struct net_device *dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1751
	void __iomem *ioaddr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1752
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1753
	int rc;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1754
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1755
	if (netif_msg_drv(&debug)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1756
		printk(KERN_INFO "%s Gigabit Ethernet driver %s loaded\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1757
		       MODULENAME, RTL8169_VERSION);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1758
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1759
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1760
	dev = alloc_etherdev(sizeof (*tp));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1761
	if (!dev) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1762
		if (netif_msg_drv(&debug))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1763
			dev_err(&pdev->dev, "unable to alloc new ethernet\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1764
		rc = -ENOMEM;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1765
		goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1766
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1767
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1768
	SET_NETDEV_DEV(dev, &pdev->dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1769
	tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1770
	tp->dev = dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1771
	tp->pci_dev = pdev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1772
	tp->msg_enable = netif_msg_init(debug.msg_enable, R8169_MSG_DEFAULT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1773
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1774
	mii = &tp->mii;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1775
	mii->dev = dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1776
	mii->mdio_read = rtl_mdio_read;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1777
	mii->mdio_write = rtl_mdio_write;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1778
	mii->phy_id_mask = 0x1f;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1779
	mii->reg_num_mask = 0x1f;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1780
	mii->supports_gmii = !!(cfg->features & RTL_FEATURE_GMII);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1781
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1782
	/* enable device (incl. PCI PM wakeup and hotplug setup) */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1783
	rc = pci_enable_device(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1784
	if (rc < 0) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1785
		if (netif_msg_probe(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1786
			dev_err(&pdev->dev, "enable failure\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1787
		goto err_out_free_dev_1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1788
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1789
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1790
	rc = pci_set_mwi(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1791
	if (rc < 0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1792
		goto err_out_disable_2;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1793
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1794
	/* make sure PCI base addr 1 is MMIO */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1795
	if (!(pci_resource_flags(pdev, region) & IORESOURCE_MEM)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1796
		if (netif_msg_probe(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1797
			dev_err(&pdev->dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1798
				"region #%d not an MMIO resource, aborting\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1799
				region);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1800
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1801
		rc = -ENODEV;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1802
		goto err_out_mwi_3;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1803
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1804
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1805
	/* check for weird/broken PCI region reporting */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1806
	if (pci_resource_len(pdev, region) < R8169_REGS_SIZE) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1807
		if (netif_msg_probe(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1808
			dev_err(&pdev->dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1809
				"Invalid PCI region size(s), aborting\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1810
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1811
		rc = -ENODEV;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1812
		goto err_out_mwi_3;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1813
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1814
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1815
	rc = pci_request_regions(pdev, MODULENAME);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1816
	if (rc < 0) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1817
		if (netif_msg_probe(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1818
			dev_err(&pdev->dev, "could not request regions.\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1819
		goto err_out_mwi_3;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1820
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1821
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1822
	tp->cp_cmd = PCIMulRW | RxChkSum;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1823
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1824
	if ((sizeof(dma_addr_t) > 4) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1825
	    !pci_set_dma_mask(pdev, DMA_64BIT_MASK) && use_dac) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1826
		tp->cp_cmd |= PCIDAC;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1827
		dev->features |= NETIF_F_HIGHDMA;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1828
	} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1829
		rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1830
		if (rc < 0) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1831
			if (netif_msg_probe(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1832
				dev_err(&pdev->dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1833
					"DMA configuration failed.\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1834
			}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1835
			goto err_out_free_res_4;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1836
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1837
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1838
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1839
	pci_set_master(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1840
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1841
	/* ioremap MMIO region */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1842
	ioaddr = ioremap(pci_resource_start(pdev, region), R8169_REGS_SIZE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1843
	if (!ioaddr) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1844
		if (netif_msg_probe(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1845
			dev_err(&pdev->dev, "cannot remap MMIO, aborting\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1846
		rc = -EIO;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1847
		goto err_out_free_res_4;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1848
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1849
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1850
	tp->pcie_cap = pci_find_capability(pdev, PCI_CAP_ID_EXP);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1851
	if (!tp->pcie_cap && netif_msg_probe(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1852
		dev_info(&pdev->dev, "no PCI Express capability\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1853
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1854
	RTL_W16(IntrMask, 0x0000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1855
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1856
	/* Soft reset the chip. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1857
	RTL_W8(ChipCmd, CmdReset);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1858
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1859
	/* Check that the chip has finished the reset. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1860
	for (i = 0; i < 100; i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1861
		if ((RTL_R8(ChipCmd) & CmdReset) == 0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1862
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1863
		msleep_interruptible(1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1864
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1865
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1866
	RTL_W16(IntrStatus, 0xffff);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1867
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1868
	/* Identify chip attached to board */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1869
	rtl8169_get_mac_version(tp, ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1870
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1871
	/* Use appropriate default if unknown */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1872
	if (tp->mac_version == RTL_GIGA_MAC_NONE) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1873
		if (netif_msg_probe(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1874
			dev_notice(&pdev->dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1875
				   "unknown MAC, using family default\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1876
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1877
		tp->mac_version = cfg->default_ver;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1878
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1879
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1880
	rtl8169_print_mac_version(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1881
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1882
	for (i = 0; i < ARRAY_SIZE(rtl_chip_info); i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1883
		if (tp->mac_version == rtl_chip_info[i].mac_version)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1884
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1885
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1886
	if (i == ARRAY_SIZE(rtl_chip_info)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1887
		dev_err(&pdev->dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1888
			"driver bug, MAC version not found in rtl_chip_info\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1889
		goto err_out_msi_5;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1890
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1891
	tp->chipset = i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1892
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1893
	RTL_W8(Cfg9346, Cfg9346_Unlock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1894
	RTL_W8(Config1, RTL_R8(Config1) | PMEnable);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1895
	RTL_W8(Config5, RTL_R8(Config5) & PMEStatus);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1896
	tp->features |= rtl_try_msi(pdev, ioaddr, cfg);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1897
	RTL_W8(Cfg9346, Cfg9346_Lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1899
	if ((tp->mac_version <= RTL_GIGA_MAC_VER_06) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1900
	    (RTL_R8(PHYstatus) & TBI_Enable)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1901
		tp->set_speed = rtl8169_set_speed_tbi;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1902
		tp->get_settings = rtl8169_gset_tbi;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1903
		tp->phy_reset_enable = rtl8169_tbi_reset_enable;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1904
		tp->phy_reset_pending = rtl8169_tbi_reset_pending;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1905
		tp->link_ok = rtl8169_tbi_link_ok;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1906
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1907
		tp->phy_1000_ctrl_reg = ADVERTISE_1000FULL; /* Implied by TBI */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1908
	} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1909
		tp->set_speed = rtl8169_set_speed_xmii;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1910
		tp->get_settings = rtl8169_gset_xmii;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1911
		tp->phy_reset_enable = rtl8169_xmii_reset_enable;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1912
		tp->phy_reset_pending = rtl8169_xmii_reset_pending;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1913
		tp->link_ok = rtl8169_xmii_link_ok;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1914
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1915
		dev->do_ioctl = rtl8169_ioctl;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1916
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1917
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1918
	/* Get MAC address.  FIXME: read EEPROM */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1919
	for (i = 0; i < MAC_ADDR_LEN; i++)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1920
		dev->dev_addr[i] = RTL_R8(MAC0 + i);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1921
	memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1922
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1923
	dev->open = rtl8169_open;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1924
	dev->hard_start_xmit = rtl8169_start_xmit;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1925
	dev->get_stats = rtl8169_get_stats;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1926
	SET_ETHTOOL_OPS(dev, &rtl8169_ethtool_ops);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1927
	dev->stop = rtl8169_close;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1928
	dev->tx_timeout = rtl8169_tx_timeout;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1929
	dev->set_multicast_list = rtl_set_rx_mode;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1930
	dev->watchdog_timeo = RTL8169_TX_TIMEOUT;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1931
	dev->irq = pdev->irq;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1932
	dev->base_addr = (unsigned long) ioaddr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1933
	dev->change_mtu = rtl8169_change_mtu;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1934
	dev->set_mac_address = rtl_set_mac_address;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1935
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1936
	netif_napi_add(dev, &tp->napi, rtl8169_poll, R8169_NAPI_WEIGHT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1937
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1938
#ifdef CONFIG_R8169_VLAN
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1939
	dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1940
	dev->vlan_rx_register = rtl8169_vlan_rx_register;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1941
#endif
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1942
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1943
#ifdef CONFIG_NET_POLL_CONTROLLER
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1944
	dev->poll_controller = rtl8169_netpoll;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1945
#endif
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1946
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1947
	tp->intr_mask = 0xffff;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1948
	tp->mmio_addr = ioaddr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1949
	tp->align = cfg->align;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1950
	tp->hw_start = cfg->hw_start;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1951
	tp->intr_event = cfg->intr_event;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1952
	tp->napi_event = cfg->napi_event;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1953
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1954
	init_timer(&tp->timer);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1955
	tp->timer.data = (unsigned long) dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1956
	tp->timer.function = rtl8169_phy_timer;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1957
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1958
	spin_lock_init(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1959
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1960
	rc = register_netdev(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1961
	if (rc < 0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1962
		goto err_out_msi_5;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1963
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1964
	pci_set_drvdata(pdev, dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1965
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1966
	if (netif_msg_probe(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1967
		u32 xid = RTL_R32(TxConfig) & 0x7cf0f8ff;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1968
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1969
		printk(KERN_INFO "%s: %s at 0x%lx, "
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1970
		       "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x, "
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1971
		       "XID %08x IRQ %d\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1972
		       dev->name,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1973
		       rtl_chip_info[tp->chipset].name,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1974
		       dev->base_addr,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1975
		       dev->dev_addr[0], dev->dev_addr[1],
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1976
		       dev->dev_addr[2], dev->dev_addr[3],
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1977
		       dev->dev_addr[4], dev->dev_addr[5], xid, dev->irq);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1978
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1979
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1980
	rtl8169_init_phy(dev, tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1981
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1982
out:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1983
	return rc;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1984
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1985
err_out_msi_5:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1986
	rtl_disable_msi(pdev, tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1987
	iounmap(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1988
err_out_free_res_4:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1989
	pci_release_regions(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1990
err_out_mwi_3:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1991
	pci_clear_mwi(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1992
err_out_disable_2:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1993
	pci_disable_device(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1994
err_out_free_dev_1:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1995
	free_netdev(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1996
	goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1997
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1998
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1999
static void __devexit rtl8169_remove_one(struct pci_dev *pdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2000
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2001
	struct net_device *dev = pci_get_drvdata(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2002
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2003
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2004
	flush_scheduled_work();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2005
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2006
	unregister_netdev(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2007
	rtl_disable_msi(pdev, tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2008
	rtl8169_release_board(pdev, dev, tp->mmio_addr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2009
	pci_set_drvdata(pdev, NULL);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2010
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2011
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2012
static void rtl8169_set_rxbufsize(struct rtl8169_private *tp,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2013
				  struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2014
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2015
	unsigned int mtu = dev->mtu;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2016
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2017
	tp->rx_buf_sz = (mtu > RX_BUF_SIZE) ? mtu + ETH_HLEN + 8 : RX_BUF_SIZE;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2018
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2019
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2020
static int rtl8169_open(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2021
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2022
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2023
	struct pci_dev *pdev = tp->pci_dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2024
	int retval = -ENOMEM;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2025
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2026
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2027
	rtl8169_set_rxbufsize(tp, dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2028
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2029
	/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2030
	 * Rx and Tx desscriptors needs 256 bytes alignment.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2031
	 * pci_alloc_consistent provides more.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2032
	 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2033
	tp->TxDescArray = pci_alloc_consistent(pdev, R8169_TX_RING_BYTES,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2034
					       &tp->TxPhyAddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2035
	if (!tp->TxDescArray)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2036
		goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2037
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2038
	tp->RxDescArray = pci_alloc_consistent(pdev, R8169_RX_RING_BYTES,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2039
					       &tp->RxPhyAddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2040
	if (!tp->RxDescArray)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2041
		goto err_free_tx_0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2042
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2043
	retval = rtl8169_init_ring(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2044
	if (retval < 0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2045
		goto err_free_rx_1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2046
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2047
	INIT_DELAYED_WORK(&tp->task, NULL);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2048
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2049
	smp_mb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2050
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2051
	retval = request_irq(dev->irq, rtl8169_interrupt,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2052
			     (tp->features & RTL_FEATURE_MSI) ? 0 : IRQF_SHARED,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2053
			     dev->name, dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2054
	if (retval < 0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2055
		goto err_release_ring_2;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2056
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2057
	napi_enable(&tp->napi);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2058
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2059
	rtl_hw_start(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2060
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2061
	rtl8169_request_timer(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2062
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2063
	rtl8169_check_link_status(dev, tp, tp->mmio_addr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2064
out:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2065
	return retval;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2066
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2067
err_release_ring_2:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2068
	rtl8169_rx_clear(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2069
err_free_rx_1:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2070
	pci_free_consistent(pdev, R8169_RX_RING_BYTES, tp->RxDescArray,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2071
			    tp->RxPhyAddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2072
err_free_tx_0:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2073
	pci_free_consistent(pdev, R8169_TX_RING_BYTES, tp->TxDescArray,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2074
			    tp->TxPhyAddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2075
	goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2076
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2077
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2078
static void rtl8169_hw_reset(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2079
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2080
	/* Disable interrupts */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2081
	rtl8169_irq_mask_and_ack(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2082
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2083
	/* Reset the chipset */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2084
	RTL_W8(ChipCmd, CmdReset);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2085
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2086
	/* PCI commit */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2087
	RTL_R8(ChipCmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2088
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2089
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2090
static void rtl_set_rx_tx_config_registers(struct rtl8169_private *tp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2091
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2092
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2093
	u32 cfg = rtl8169_rx_config;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2094
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2095
	cfg |= (RTL_R32(RxConfig) & rtl_chip_info[tp->chipset].RxConfigMask);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2096
	RTL_W32(RxConfig, cfg);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2097
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2098
	/* Set DMA burst size and Interframe Gap Time */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2099
	RTL_W32(TxConfig, (TX_DMA_BURST << TxDMAShift) |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2100
		(InterFrameGap << TxInterFrameGapShift));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2101
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2102
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2103
static void rtl_hw_start(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2104
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2105
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2106
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2107
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2108
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2109
	/* Soft reset the chip. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2110
	RTL_W8(ChipCmd, CmdReset);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2111
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2112
	/* Check that the chip has finished the reset. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2113
	for (i = 0; i < 100; i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2114
		if ((RTL_R8(ChipCmd) & CmdReset) == 0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2115
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2116
		msleep_interruptible(1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2117
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2118
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2119
	tp->hw_start(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2120
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2121
	netif_start_queue(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2122
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2123
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2124
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2125
static void rtl_set_rx_tx_desc_registers(struct rtl8169_private *tp,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2126
					 void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2127
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2128
	/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2129
	 * Magic spell: some iop3xx ARM board needs the TxDescAddrHigh
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2130
	 * register to be written before TxDescAddrLow to work.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2131
	 * Switching from MMIO to I/O access fixes the issue as well.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2132
	 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2133
	RTL_W32(TxDescStartAddrHigh, ((u64) tp->TxPhyAddr) >> 32);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2134
	RTL_W32(TxDescStartAddrLow, ((u64) tp->TxPhyAddr) & DMA_32BIT_MASK);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2135
	RTL_W32(RxDescAddrHigh, ((u64) tp->RxPhyAddr) >> 32);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2136
	RTL_W32(RxDescAddrLow, ((u64) tp->RxPhyAddr) & DMA_32BIT_MASK);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2137
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2138
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2139
static u16 rtl_rw_cpluscmd(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2140
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2141
	u16 cmd;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2142
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2143
	cmd = RTL_R16(CPlusCmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2144
	RTL_W16(CPlusCmd, cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2145
	return cmd;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2146
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2147
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2148
static void rtl_set_rx_max_size(void __iomem *ioaddr, unsigned int rx_buf_sz)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2149
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2150
	/* Low hurts. Let's disable the filtering. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2151
	RTL_W16(RxMaxSize, rx_buf_sz);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2152
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2153
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2154
static void rtl8169_set_magic_reg(void __iomem *ioaddr, unsigned mac_version)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2155
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2156
	struct {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2157
		u32 mac_version;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2158
		u32 clk;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2159
		u32 val;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2160
	} cfg2_info [] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2161
		{ RTL_GIGA_MAC_VER_05, PCI_Clock_33MHz, 0x000fff00 }, // 8110SCd
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2162
		{ RTL_GIGA_MAC_VER_05, PCI_Clock_66MHz, 0x000fffff },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2163
		{ RTL_GIGA_MAC_VER_06, PCI_Clock_33MHz, 0x00ffff00 }, // 8110SCe
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2164
		{ RTL_GIGA_MAC_VER_06, PCI_Clock_66MHz, 0x00ffffff }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2165
	}, *p = cfg2_info;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2166
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2167
	u32 clk;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2168
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2169
	clk = RTL_R8(Config2) & PCI_Clock_66MHz;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2170
	for (i = 0; i < ARRAY_SIZE(cfg2_info); i++, p++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2171
		if ((p->mac_version == mac_version) && (p->clk == clk)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2172
			RTL_W32(0x7c, p->val);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2173
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2174
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2175
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2176
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2177
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2178
static void rtl_hw_start_8169(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2179
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2180
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2181
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2182
	struct pci_dev *pdev = tp->pci_dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2183
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2184
	if (tp->mac_version == RTL_GIGA_MAC_VER_05) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2185
		RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) | PCIMulRW);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2186
		pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, 0x08);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2187
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2188
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2189
	RTL_W8(Cfg9346, Cfg9346_Unlock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2190
	if ((tp->mac_version == RTL_GIGA_MAC_VER_01) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2191
	    (tp->mac_version == RTL_GIGA_MAC_VER_02) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2192
	    (tp->mac_version == RTL_GIGA_MAC_VER_03) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2193
	    (tp->mac_version == RTL_GIGA_MAC_VER_04))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2194
		RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2195
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2196
	RTL_W8(EarlyTxThres, EarlyTxThld);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2197
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2198
	rtl_set_rx_max_size(ioaddr, tp->rx_buf_sz);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2199
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2200
	if ((tp->mac_version == RTL_GIGA_MAC_VER_01) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2201
	    (tp->mac_version == RTL_GIGA_MAC_VER_02) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2202
	    (tp->mac_version == RTL_GIGA_MAC_VER_03) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2203
	    (tp->mac_version == RTL_GIGA_MAC_VER_04))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2204
		rtl_set_rx_tx_config_registers(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2205
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2206
	tp->cp_cmd |= rtl_rw_cpluscmd(ioaddr) | PCIMulRW;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2207
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2208
	if ((tp->mac_version == RTL_GIGA_MAC_VER_02) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2209
	    (tp->mac_version == RTL_GIGA_MAC_VER_03)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2210
		dprintk("Set MAC Reg C+CR Offset 0xE0. "
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2211
			"Bit-3 and bit-14 MUST be 1\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2212
		tp->cp_cmd |= (1 << 14);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2213
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2214
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2215
	RTL_W16(CPlusCmd, tp->cp_cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2216
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2217
	rtl8169_set_magic_reg(ioaddr, tp->mac_version);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2218
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2219
	/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2220
	 * Undocumented corner. Supposedly:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2221
	 * (TxTimer << 12) | (TxPackets << 8) | (RxTimer << 4) | RxPackets
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2222
	 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2223
	RTL_W16(IntrMitigate, 0x0000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2224
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2225
	rtl_set_rx_tx_desc_registers(tp, ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2226
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2227
	if ((tp->mac_version != RTL_GIGA_MAC_VER_01) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2228
	    (tp->mac_version != RTL_GIGA_MAC_VER_02) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2229
	    (tp->mac_version != RTL_GIGA_MAC_VER_03) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2230
	    (tp->mac_version != RTL_GIGA_MAC_VER_04)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2231
		RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2232
		rtl_set_rx_tx_config_registers(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2233
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2234
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2235
	RTL_W8(Cfg9346, Cfg9346_Lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2236
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2237
	/* Initially a 10 us delay. Turned it into a PCI commit. - FR */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2238
	RTL_R8(IntrMask);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2239
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2240
	RTL_W32(RxMissed, 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2241
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2242
	rtl_set_rx_mode(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2243
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2244
	/* no early-rx interrupts */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2245
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xF000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2246
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2247
	/* Enable all known interrupts by setting the interrupt mask. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2248
	RTL_W16(IntrMask, tp->intr_event);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2249
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2250
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2251
static void rtl_tx_performance_tweak(struct pci_dev *pdev, u16 force)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2252
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2253
	struct net_device *dev = pci_get_drvdata(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2254
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2255
	int cap = tp->pcie_cap;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2256
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2257
	if (cap) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2258
		u16 ctl;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2259
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2260
		pci_read_config_word(pdev, cap + PCI_EXP_DEVCTL, &ctl);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2261
		ctl = (ctl & ~PCI_EXP_DEVCTL_READRQ) | force;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2262
		pci_write_config_word(pdev, cap + PCI_EXP_DEVCTL, ctl);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2263
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2264
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2265
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2266
static void rtl_csi_access_enable(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2267
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2268
	u32 csi;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2269
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2270
	csi = rtl_csi_read(ioaddr, 0x070c) & 0x00ffffff;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2271
	rtl_csi_write(ioaddr, 0x070c, csi | 0x27000000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2272
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2273
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2274
struct ephy_info {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2275
	unsigned int offset;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2276
	u16 mask;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2277
	u16 bits;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2278
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2279
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2280
static void rtl_ephy_init(void __iomem *ioaddr, struct ephy_info *e, int len)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2281
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2282
	u16 w;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2283
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2284
	while (len-- > 0) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2285
		w = (rtl_ephy_read(ioaddr, e->offset) & ~e->mask) | e->bits;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2286
		rtl_ephy_write(ioaddr, e->offset, w);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2287
		e++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2288
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2289
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2290
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2291
static void rtl_hw_start_8168(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2292
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2293
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2294
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2295
	struct pci_dev *pdev = tp->pci_dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2296
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2297
	RTL_W8(Cfg9346, Cfg9346_Unlock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2298
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2299
	RTL_W8(EarlyTxThres, EarlyTxThld);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2300
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2301
	rtl_set_rx_max_size(ioaddr, tp->rx_buf_sz);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2302
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2303
	rtl_set_rx_tx_config_registers(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2304
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2305
	tp->cp_cmd |= RTL_R16(CPlusCmd) | PktCntrDisable | INTT_1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2306
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2307
	RTL_W16(CPlusCmd, tp->cp_cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2308
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2309
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2310
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2311
	RTL_W16(IntrMitigate, 0x5151);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2312
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2313
	/* Work around for RxFIFO overflow. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2314
	if (tp->mac_version == RTL_GIGA_MAC_VER_11) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2315
		tp->intr_event |= RxFIFOOver | PCSTimeout;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2316
		tp->intr_event &= ~RxOverflow;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2317
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2318
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2319
	rtl_set_rx_tx_desc_registers(tp, ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2320
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2321
	RTL_W8(Cfg9346, Cfg9346_Lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2322
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2323
	RTL_R8(IntrMask);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2324
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2325
	rtl_set_rx_mode(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2326
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2327
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2328
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2329
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xF000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2330
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2331
	RTL_W16(IntrMask, tp->intr_event);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2332
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2333
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2334
#define R810X_CPCMD_QUIRK_MASK (\
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2335
	EnableBist | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2336
	Mac_dbgo_oe | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2337
	Force_half_dup | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2338
	Force_half_dup | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2339
	Force_txflow_en | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2340
	Cxpl_dbg_sel | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2341
	ASF | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2342
	PktCntrDisable | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2343
	PCIDAC | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2344
	PCIMulRW)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2345
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2346
static void rtl_hw_start_8102e_1(void __iomem *ioaddr, struct pci_dev *pdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2347
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2348
	static struct ephy_info e_info_8102e_1[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2349
		{ 0x01,	0, 0x6e65 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2350
		{ 0x02,	0, 0x091f },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2351
		{ 0x03,	0, 0xc2f9 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2352
		{ 0x06,	0, 0xafb5 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2353
		{ 0x07,	0, 0x0e00 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2354
		{ 0x19,	0, 0xec80 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2355
		{ 0x01,	0, 0x2e65 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2356
		{ 0x01,	0, 0x6e65 }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2357
	};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2358
	u8 cfg1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2359
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2360
	rtl_csi_access_enable(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2361
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2362
	RTL_W8(DBG_REG, FIX_NAK_1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2363
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2364
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2365
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2366
	RTL_W8(Config1,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2367
	       LEDS1 | LEDS0 | Speed_down | MEMMAP | IOMAP | VPD | PMEnable);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2368
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2369
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2370
	cfg1 = RTL_R8(Config1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2371
	if ((cfg1 & LEDS0) && (cfg1 & LEDS1))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2372
		RTL_W8(Config1, cfg1 & ~LEDS0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2373
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2374
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R810X_CPCMD_QUIRK_MASK);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2375
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2376
	rtl_ephy_init(ioaddr, e_info_8102e_1, ARRAY_SIZE(e_info_8102e_1));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2377
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2378
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2379
static void rtl_hw_start_8102e_2(void __iomem *ioaddr, struct pci_dev *pdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2380
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2381
	rtl_csi_access_enable(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2382
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2383
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2384
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2385
	RTL_W8(Config1, MEMMAP | IOMAP | VPD | PMEnable);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2386
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2387
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2388
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R810X_CPCMD_QUIRK_MASK);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2389
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2390
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2391
static void rtl_hw_start_8102e_3(void __iomem *ioaddr, struct pci_dev *pdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2392
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2393
	rtl_hw_start_8102e_2(ioaddr, pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2394
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2395
	rtl_ephy_write(ioaddr, 0x03, 0xc2f9);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2396
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2397
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2398
static void rtl_hw_start_8101(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2399
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2400
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2401
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2402
	struct pci_dev *pdev = tp->pci_dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2403
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2404
	if ((tp->mac_version == RTL_GIGA_MAC_VER_13) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2405
	    (tp->mac_version == RTL_GIGA_MAC_VER_16)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2406
		int cap = tp->pcie_cap;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2407
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2408
		if (cap) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2409
			pci_write_config_word(pdev, cap + PCI_EXP_DEVCTL,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2410
					      PCI_EXP_DEVCTL_NOSNOOP_EN);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2411
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2412
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2413
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2414
	switch (tp->mac_version) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2415
	case RTL_GIGA_MAC_VER_07:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2416
		rtl_hw_start_8102e_1(ioaddr, pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2417
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2418
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2419
	case RTL_GIGA_MAC_VER_08:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2420
		rtl_hw_start_8102e_3(ioaddr, pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2421
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2422
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2423
	case RTL_GIGA_MAC_VER_09:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2424
		rtl_hw_start_8102e_2(ioaddr, pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2425
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2426
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2427
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2428
	RTL_W8(Cfg9346, Cfg9346_Unlock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2429
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2430
	RTL_W8(EarlyTxThres, EarlyTxThld);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2431
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2432
	rtl_set_rx_max_size(ioaddr, tp->rx_buf_sz);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2433
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2434
	tp->cp_cmd |= rtl_rw_cpluscmd(ioaddr) | PCIMulRW;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2435
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2436
	RTL_W16(CPlusCmd, tp->cp_cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2437
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2438
	RTL_W16(IntrMitigate, 0x0000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2439
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2440
	rtl_set_rx_tx_desc_registers(tp, ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2441
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2442
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2443
	rtl_set_rx_tx_config_registers(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2444
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2445
	RTL_W8(Cfg9346, Cfg9346_Lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2446
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2447
	RTL_R8(IntrMask);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2448
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2449
	rtl_set_rx_mode(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2450
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2451
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2452
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2453
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xf000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2454
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2455
	RTL_W16(IntrMask, tp->intr_event);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2456
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2457
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2458
static int rtl8169_change_mtu(struct net_device *dev, int new_mtu)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2459
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2460
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2461
	int ret = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2462
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2463
	if (new_mtu < ETH_ZLEN || new_mtu > SafeMtu)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2464
		return -EINVAL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2465
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2466
	dev->mtu = new_mtu;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2467
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2468
	if (!netif_running(dev))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2469
		goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2470
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2471
	rtl8169_down(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2472
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2473
	rtl8169_set_rxbufsize(tp, dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2474
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2475
	ret = rtl8169_init_ring(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2476
	if (ret < 0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2477
		goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2478
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2479
	napi_enable(&tp->napi);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2480
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2481
	rtl_hw_start(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2482
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2483
	rtl8169_request_timer(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2484
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2485
out:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2486
	return ret;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2487
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2488
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2489
static inline void rtl8169_make_unusable_by_asic(struct RxDesc *desc)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2490
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2491
	desc->addr = cpu_to_le64(0x0badbadbadbadbadull);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2492
	desc->opts1 &= ~cpu_to_le32(DescOwn | RsvdMask);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2493
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2494
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2495
static void rtl8169_free_rx_skb(struct rtl8169_private *tp,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2496
				struct sk_buff **sk_buff, struct RxDesc *desc)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2497
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2498
	struct pci_dev *pdev = tp->pci_dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2499
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2500
	pci_unmap_single(pdev, le64_to_cpu(desc->addr), tp->rx_buf_sz,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2501
			 PCI_DMA_FROMDEVICE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2502
	dev_kfree_skb(*sk_buff);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2503
	*sk_buff = NULL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2504
	rtl8169_make_unusable_by_asic(desc);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2505
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2506
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2507
static inline void rtl8169_mark_to_asic(struct RxDesc *desc, u32 rx_buf_sz)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2508
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2509
	u32 eor = le32_to_cpu(desc->opts1) & RingEnd;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2510
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2511
	desc->opts1 = cpu_to_le32(DescOwn | eor | rx_buf_sz);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2512
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2513
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2514
static inline void rtl8169_map_to_asic(struct RxDesc *desc, dma_addr_t mapping,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2515
				       u32 rx_buf_sz)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2516
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2517
	desc->addr = cpu_to_le64(mapping);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2518
	wmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2519
	rtl8169_mark_to_asic(desc, rx_buf_sz);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2520
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2521
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2522
static struct sk_buff *rtl8169_alloc_rx_skb(struct pci_dev *pdev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2523
					    struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2524
					    struct RxDesc *desc, int rx_buf_sz,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2525
					    unsigned int align)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2526
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2527
	struct sk_buff *skb;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2528
	dma_addr_t mapping;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2529
	unsigned int pad;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2530
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2531
	pad = align ? align : NET_IP_ALIGN;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2532
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2533
	skb = netdev_alloc_skb(dev, rx_buf_sz + pad);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2534
	if (!skb)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2535
		goto err_out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2536
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2537
	skb_reserve(skb, align ? ((pad - 1) & (unsigned long)skb->data) : pad);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2538
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2539
	mapping = pci_map_single(pdev, skb->data, rx_buf_sz,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2540
				 PCI_DMA_FROMDEVICE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2541
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2542
	rtl8169_map_to_asic(desc, mapping, rx_buf_sz);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2543
out:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2544
	return skb;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2545
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2546
err_out:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2547
	rtl8169_make_unusable_by_asic(desc);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2548
	goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2549
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2550
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2551
static void rtl8169_rx_clear(struct rtl8169_private *tp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2552
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2553
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2554
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2555
	for (i = 0; i < NUM_RX_DESC; i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2556
		if (tp->Rx_skbuff[i]) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2557
			rtl8169_free_rx_skb(tp, tp->Rx_skbuff + i,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2558
					    tp->RxDescArray + i);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2559
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2560
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2561
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2562
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2563
static u32 rtl8169_rx_fill(struct rtl8169_private *tp, struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2564
			   u32 start, u32 end)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2565
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2566
	u32 cur;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2567
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2568
	for (cur = start; end - cur != 0; cur++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2569
		struct sk_buff *skb;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2570
		unsigned int i = cur % NUM_RX_DESC;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2571
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2572
		WARN_ON((s32)(end - cur) < 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2573
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2574
		if (tp->Rx_skbuff[i])
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2575
			continue;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2576
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2577
		skb = rtl8169_alloc_rx_skb(tp->pci_dev, dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2578
					   tp->RxDescArray + i,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2579
					   tp->rx_buf_sz, tp->align);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2580
		if (!skb)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2581
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2582
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2583
		tp->Rx_skbuff[i] = skb;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2584
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2585
	return cur - start;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2586
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2587
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2588
static inline void rtl8169_mark_as_last_descriptor(struct RxDesc *desc)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2589
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2590
	desc->opts1 |= cpu_to_le32(RingEnd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2591
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2592
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2593
static void rtl8169_init_ring_indexes(struct rtl8169_private *tp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2594
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2595
	tp->dirty_tx = tp->dirty_rx = tp->cur_tx = tp->cur_rx = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2596
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2597
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2598
static int rtl8169_init_ring(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2599
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2600
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2601
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2602
	rtl8169_init_ring_indexes(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2603
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2604
	memset(tp->tx_skb, 0x0, NUM_TX_DESC * sizeof(struct ring_info));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2605
	memset(tp->Rx_skbuff, 0x0, NUM_RX_DESC * sizeof(struct sk_buff *));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2606
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2607
	if (rtl8169_rx_fill(tp, dev, 0, NUM_RX_DESC) != NUM_RX_DESC)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2608
		goto err_out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2609
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2610
	rtl8169_mark_as_last_descriptor(tp->RxDescArray + NUM_RX_DESC - 1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2611
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2612
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2613
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2614
err_out:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2615
	rtl8169_rx_clear(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2616
	return -ENOMEM;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2617
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2618
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2619
static void rtl8169_unmap_tx_skb(struct pci_dev *pdev, struct ring_info *tx_skb,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2620
				 struct TxDesc *desc)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2621
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2622
	unsigned int len = tx_skb->len;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2623
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2624
	pci_unmap_single(pdev, le64_to_cpu(desc->addr), len, PCI_DMA_TODEVICE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2625
	desc->opts1 = 0x00;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2626
	desc->opts2 = 0x00;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2627
	desc->addr = 0x00;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2628
	tx_skb->len = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2629
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2630
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2631
static void rtl8169_tx_clear(struct rtl8169_private *tp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2632
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2633
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2634
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2635
	for (i = tp->dirty_tx; i < tp->dirty_tx + NUM_TX_DESC; i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2636
		unsigned int entry = i % NUM_TX_DESC;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2637
		struct ring_info *tx_skb = tp->tx_skb + entry;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2638
		unsigned int len = tx_skb->len;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2639
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2640
		if (len) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2641
			struct sk_buff *skb = tx_skb->skb;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2642
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2643
			rtl8169_unmap_tx_skb(tp->pci_dev, tx_skb,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2644
					     tp->TxDescArray + entry);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2645
			if (skb) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2646
				dev_kfree_skb(skb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2647
				tx_skb->skb = NULL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2648
			}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2649
			tp->dev->stats.tx_dropped++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2650
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2651
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2652
	tp->cur_tx = tp->dirty_tx = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2653
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2654
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2655
static void rtl8169_schedule_work(struct net_device *dev, work_func_t task)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2656
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2657
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2658
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2659
	PREPARE_DELAYED_WORK(&tp->task, task);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2660
	schedule_delayed_work(&tp->task, 4);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2661
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2662
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2663
static void rtl8169_wait_for_quiescence(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2664
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2665
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2666
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2667
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2668
	synchronize_irq(dev->irq);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2669
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2670
	/* Wait for any pending NAPI task to complete */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2671
	napi_disable(&tp->napi);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2672
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2673
	rtl8169_irq_mask_and_ack(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2674
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2675
	tp->intr_mask = 0xffff;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2676
	RTL_W16(IntrMask, tp->intr_event);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2677
	napi_enable(&tp->napi);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2678
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2679
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2680
static void rtl8169_reinit_task(struct work_struct *work)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2681
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2682
	struct rtl8169_private *tp =
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2683
		container_of(work, struct rtl8169_private, task.work);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2684
	struct net_device *dev = tp->dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2685
	int ret;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2686
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2687
	rtnl_lock();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2688
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2689
	if (!netif_running(dev))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2690
		goto out_unlock;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2691
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2692
	rtl8169_wait_for_quiescence(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2693
	rtl8169_close(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2694
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2695
	ret = rtl8169_open(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2696
	if (unlikely(ret < 0)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2697
		if (net_ratelimit() && netif_msg_drv(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2698
			printk(KERN_ERR PFX "%s: reinit failure (status = %d)."
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2699
			       " Rescheduling.\n", dev->name, ret);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2700
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2701
		rtl8169_schedule_work(dev, rtl8169_reinit_task);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2702
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2703
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2704
out_unlock:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2705
	rtnl_unlock();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2706
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2707
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2708
static void rtl8169_reset_task(struct work_struct *work)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2709
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2710
	struct rtl8169_private *tp =
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2711
		container_of(work, struct rtl8169_private, task.work);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2712
	struct net_device *dev = tp->dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2713
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2714
	rtnl_lock();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2715
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2716
	if (!netif_running(dev))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2717
		goto out_unlock;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2718
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2719
	rtl8169_wait_for_quiescence(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2720
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2721
	rtl8169_rx_interrupt(dev, tp, tp->mmio_addr, ~(u32)0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2722
	rtl8169_tx_clear(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2723
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2724
	if (tp->dirty_rx == tp->cur_rx) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2725
		rtl8169_init_ring_indexes(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2726
		rtl_hw_start(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2727
		netif_wake_queue(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2728
		rtl8169_check_link_status(dev, tp, tp->mmio_addr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2729
	} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2730
		if (net_ratelimit() && netif_msg_intr(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2731
			printk(KERN_EMERG PFX "%s: Rx buffers shortage\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2732
			       dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2733
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2734
		rtl8169_schedule_work(dev, rtl8169_reset_task);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2735
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2736
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2737
out_unlock:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2738
	rtnl_unlock();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2739
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2740
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2741
static void rtl8169_tx_timeout(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2742
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2743
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2744
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2745
	rtl8169_hw_reset(tp->mmio_addr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2746
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2747
	/* Let's wait a bit while any (async) irq lands on */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2748
	rtl8169_schedule_work(dev, rtl8169_reset_task);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2749
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2750
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2751
static int rtl8169_xmit_frags(struct rtl8169_private *tp, struct sk_buff *skb,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2752
			      u32 opts1)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2753
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2754
	struct skb_shared_info *info = skb_shinfo(skb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2755
	unsigned int cur_frag, entry;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2756
	struct TxDesc * uninitialized_var(txd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2757
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2758
	entry = tp->cur_tx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2759
	for (cur_frag = 0; cur_frag < info->nr_frags; cur_frag++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2760
		skb_frag_t *frag = info->frags + cur_frag;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2761
		dma_addr_t mapping;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2762
		u32 status, len;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2763
		void *addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2764
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2765
		entry = (entry + 1) % NUM_TX_DESC;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2766
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2767
		txd = tp->TxDescArray + entry;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2768
		len = frag->size;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2769
		addr = ((void *) page_address(frag->page)) + frag->page_offset;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2770
		mapping = pci_map_single(tp->pci_dev, addr, len, PCI_DMA_TODEVICE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2771
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2772
		/* anti gcc 2.95.3 bugware (sic) */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2773
		status = opts1 | len | (RingEnd * !((entry + 1) % NUM_TX_DESC));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2774
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2775
		txd->opts1 = cpu_to_le32(status);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2776
		txd->addr = cpu_to_le64(mapping);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2777
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2778
		tp->tx_skb[entry].len = len;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2779
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2780
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2781
	if (cur_frag) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2782
		tp->tx_skb[entry].skb = skb;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2783
		txd->opts1 |= cpu_to_le32(LastFrag);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2784
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2785
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2786
	return cur_frag;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2787
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2788
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2789
static inline u32 rtl8169_tso_csum(struct sk_buff *skb, struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2790
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2791
	if (dev->features & NETIF_F_TSO) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2792
		u32 mss = skb_shinfo(skb)->gso_size;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2793
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2794
		if (mss)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2795
			return LargeSend | ((mss & MSSMask) << MSSShift);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2796
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2797
	if (skb->ip_summed == CHECKSUM_PARTIAL) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2798
		const struct iphdr *ip = ip_hdr(skb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2799
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2800
		if (ip->protocol == IPPROTO_TCP)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2801
			return IPCS | TCPCS;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2802
		else if (ip->protocol == IPPROTO_UDP)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2803
			return IPCS | UDPCS;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2804
		WARN_ON(1);	/* we need a WARN() */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2805
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2806
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2807
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2808
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2809
static int rtl8169_start_xmit(struct sk_buff *skb, struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2810
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2811
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2812
	unsigned int frags, entry = tp->cur_tx % NUM_TX_DESC;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2813
	struct TxDesc *txd = tp->TxDescArray + entry;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2814
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2815
	dma_addr_t mapping;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2816
	u32 status, len;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2817
	u32 opts1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2818
	int ret = NETDEV_TX_OK;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2819
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2820
	if (unlikely(TX_BUFFS_AVAIL(tp) < skb_shinfo(skb)->nr_frags)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2821
		if (netif_msg_drv(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2822
			printk(KERN_ERR
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2823
			       "%s: BUG! Tx Ring full when queue awake!\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2824
			       dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2825
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2826
		goto err_stop;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2827
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2828
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2829
	if (unlikely(le32_to_cpu(txd->opts1) & DescOwn))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2830
		goto err_stop;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2831
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2832
	opts1 = DescOwn | rtl8169_tso_csum(skb, dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2833
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2834
	frags = rtl8169_xmit_frags(tp, skb, opts1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2835
	if (frags) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2836
		len = skb_headlen(skb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2837
		opts1 |= FirstFrag;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2838
	} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2839
		len = skb->len;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2840
		opts1 |= FirstFrag | LastFrag;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2841
		tp->tx_skb[entry].skb = skb;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2842
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2843
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2844
	mapping = pci_map_single(tp->pci_dev, skb->data, len, PCI_DMA_TODEVICE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2845
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2846
	tp->tx_skb[entry].len = len;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2847
	txd->addr = cpu_to_le64(mapping);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2848
	txd->opts2 = cpu_to_le32(rtl8169_tx_vlan_tag(tp, skb));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2849
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2850
	wmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2851
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2852
	/* anti gcc 2.95.3 bugware (sic) */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2853
	status = opts1 | len | (RingEnd * !((entry + 1) % NUM_TX_DESC));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2854
	txd->opts1 = cpu_to_le32(status);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2855
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2856
	dev->trans_start = jiffies;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2857
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2858
	tp->cur_tx += frags + 1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2859
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2860
	smp_wmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2861
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2862
	RTL_W8(TxPoll, NPQ);	/* set polling bit */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2863
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2864
	if (TX_BUFFS_AVAIL(tp) < MAX_SKB_FRAGS) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2865
		netif_stop_queue(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2866
		smp_rmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2867
		if (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2868
			netif_wake_queue(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2869
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2870
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2871
out:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2872
	return ret;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2873
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2874
err_stop:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2875
	netif_stop_queue(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2876
	ret = NETDEV_TX_BUSY;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2877
	dev->stats.tx_dropped++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2878
	goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2879
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2880
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2881
static void rtl8169_pcierr_interrupt(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2882
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2883
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2884
	struct pci_dev *pdev = tp->pci_dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2885
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2886
	u16 pci_status, pci_cmd;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2887
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2888
	pci_read_config_word(pdev, PCI_COMMAND, &pci_cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2889
	pci_read_config_word(pdev, PCI_STATUS, &pci_status);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2890
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2891
	if (netif_msg_intr(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2892
		printk(KERN_ERR
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2893
		       "%s: PCI error (cmd = 0x%04x, status = 0x%04x).\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2894
		       dev->name, pci_cmd, pci_status);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2895
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2896
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2897
	/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2898
	 * The recovery sequence below admits a very elaborated explanation:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2899
	 * - it seems to work;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2900
	 * - I did not see what else could be done;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2901
	 * - it makes iop3xx happy.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2902
	 *
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2903
	 * Feel free to adjust to your needs.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2904
	 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2905
	if (pdev->broken_parity_status)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2906
		pci_cmd &= ~PCI_COMMAND_PARITY;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2907
	else
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2908
		pci_cmd |= PCI_COMMAND_SERR | PCI_COMMAND_PARITY;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2909
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2910
	pci_write_config_word(pdev, PCI_COMMAND, pci_cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2911
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2912
	pci_write_config_word(pdev, PCI_STATUS,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2913
		pci_status & (PCI_STATUS_DETECTED_PARITY |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2914
		PCI_STATUS_SIG_SYSTEM_ERROR | PCI_STATUS_REC_MASTER_ABORT |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2915
		PCI_STATUS_REC_TARGET_ABORT | PCI_STATUS_SIG_TARGET_ABORT));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2916
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2917
	/* The infamous DAC f*ckup only happens at boot time */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2918
	if ((tp->cp_cmd & PCIDAC) && !tp->dirty_rx && !tp->cur_rx) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2919
		if (netif_msg_intr(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2920
			printk(KERN_INFO "%s: disabling PCI DAC.\n", dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2921
		tp->cp_cmd &= ~PCIDAC;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2922
		RTL_W16(CPlusCmd, tp->cp_cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2923
		dev->features &= ~NETIF_F_HIGHDMA;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2924
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2925
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2926
	rtl8169_hw_reset(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2927
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2928
	rtl8169_schedule_work(dev, rtl8169_reinit_task);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2929
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2930
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2931
static void rtl8169_tx_interrupt(struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2932
				 struct rtl8169_private *tp,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2933
				 void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2934
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2935
	unsigned int dirty_tx, tx_left;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2936
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2937
	dirty_tx = tp->dirty_tx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2938
	smp_rmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2939
	tx_left = tp->cur_tx - dirty_tx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2940
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2941
	while (tx_left > 0) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2942
		unsigned int entry = dirty_tx % NUM_TX_DESC;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2943
		struct ring_info *tx_skb = tp->tx_skb + entry;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2944
		u32 len = tx_skb->len;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2945
		u32 status;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2946
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2947
		rmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2948
		status = le32_to_cpu(tp->TxDescArray[entry].opts1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2949
		if (status & DescOwn)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2950
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2951
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2952
		dev->stats.tx_bytes += len;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2953
		dev->stats.tx_packets++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2954
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2955
		rtl8169_unmap_tx_skb(tp->pci_dev, tx_skb, tp->TxDescArray + entry);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2956
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2957
		if (status & LastFrag) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2958
			dev_kfree_skb_irq(tx_skb->skb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2959
			tx_skb->skb = NULL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2960
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2961
		dirty_tx++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2962
		tx_left--;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2963
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2964
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2965
	if (tp->dirty_tx != dirty_tx) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2966
		tp->dirty_tx = dirty_tx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2967
		smp_wmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2968
		if (netif_queue_stopped(dev) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2969
		    (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2970
			netif_wake_queue(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2971
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2972
		/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2973
		 * 8168 hack: TxPoll requests are lost when the Tx packets are
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2974
		 * too close. Let's kick an extra TxPoll request when a burst
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2975
		 * of start_xmit activity is detected (if it is not detected,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2976
		 * it is slow enough). -- FR
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2977
		 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2978
		smp_rmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2979
		if (tp->cur_tx != dirty_tx)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2980
			RTL_W8(TxPoll, NPQ);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2981
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2982
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2983
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2984
static inline int rtl8169_fragmented_frame(u32 status)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2985
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2986
	return (status & (FirstFrag | LastFrag)) != (FirstFrag | LastFrag);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2987
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2988
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2989
static inline void rtl8169_rx_csum(struct sk_buff *skb, struct RxDesc *desc)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2990
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2991
	u32 opts1 = le32_to_cpu(desc->opts1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2992
	u32 status = opts1 & RxProtoMask;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2993
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2994
	if (((status == RxProtoTCP) && !(opts1 & TCPFail)) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2995
	    ((status == RxProtoUDP) && !(opts1 & UDPFail)) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2996
	    ((status == RxProtoIP) && !(opts1 & IPFail)))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2997
		skb->ip_summed = CHECKSUM_UNNECESSARY;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2998
	else
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2999
		skb->ip_summed = CHECKSUM_NONE;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3000
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3001
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3002
static inline bool rtl8169_try_rx_copy(struct sk_buff **sk_buff,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3003
				       struct rtl8169_private *tp, int pkt_size,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3004
				       dma_addr_t addr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3005
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3006
	struct sk_buff *skb;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3007
	bool done = false;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3008
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3009
	if (pkt_size >= rx_copybreak)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3010
		goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3011
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3012
	skb = netdev_alloc_skb(tp->dev, pkt_size + NET_IP_ALIGN);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3013
	if (!skb)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3014
		goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3015
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3016
	pci_dma_sync_single_for_cpu(tp->pci_dev, addr, pkt_size,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3017
				    PCI_DMA_FROMDEVICE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3018
	skb_reserve(skb, NET_IP_ALIGN);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3019
	skb_copy_from_linear_data(*sk_buff, skb->data, pkt_size);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3020
	*sk_buff = skb;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3021
	done = true;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3022
out:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3023
	return done;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3024
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3025
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3026
static int rtl8169_rx_interrupt(struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3027
				struct rtl8169_private *tp,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3028
				void __iomem *ioaddr, u32 budget)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3029
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3030
	unsigned int cur_rx, rx_left;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3031
	unsigned int delta, count;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3032
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3033
	cur_rx = tp->cur_rx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3034
	rx_left = NUM_RX_DESC + tp->dirty_rx - cur_rx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3035
	rx_left = min(rx_left, budget);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3036
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3037
	for (; rx_left > 0; rx_left--, cur_rx++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3038
		unsigned int entry = cur_rx % NUM_RX_DESC;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3039
		struct RxDesc *desc = tp->RxDescArray + entry;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3040
		u32 status;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3041
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3042
		rmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3043
		status = le32_to_cpu(desc->opts1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3044
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3045
		if (status & DescOwn)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3046
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3047
		if (unlikely(status & RxRES)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3048
			if (netif_msg_rx_err(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3049
				printk(KERN_INFO
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3050
				       "%s: Rx ERROR. status = %08x\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3051
				       dev->name, status);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3052
			}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3053
			dev->stats.rx_errors++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3054
			if (status & (RxRWT | RxRUNT))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3055
				dev->stats.rx_length_errors++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3056
			if (status & RxCRC)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3057
				dev->stats.rx_crc_errors++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3058
			if (status & RxFOVF) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3059
				rtl8169_schedule_work(dev, rtl8169_reset_task);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3060
				dev->stats.rx_fifo_errors++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3061
			}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3062
			rtl8169_mark_to_asic(desc, tp->rx_buf_sz);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3063
		} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3064
			struct sk_buff *skb = tp->Rx_skbuff[entry];
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3065
			dma_addr_t addr = le64_to_cpu(desc->addr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3066
			int pkt_size = (status & 0x00001FFF) - 4;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3067
			struct pci_dev *pdev = tp->pci_dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3068
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3069
			/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3070
			 * The driver does not support incoming fragmented
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3071
			 * frames. They are seen as a symptom of over-mtu
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3072
			 * sized frames.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3073
			 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3074
			if (unlikely(rtl8169_fragmented_frame(status))) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3075
				dev->stats.rx_dropped++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3076
				dev->stats.rx_length_errors++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3077
				rtl8169_mark_to_asic(desc, tp->rx_buf_sz);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3078
				continue;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3079
			}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3080
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3081
			rtl8169_rx_csum(skb, desc);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3082
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3083
			if (rtl8169_try_rx_copy(&skb, tp, pkt_size, addr)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3084
				pci_dma_sync_single_for_device(pdev, addr,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3085
					pkt_size, PCI_DMA_FROMDEVICE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3086
				rtl8169_mark_to_asic(desc, tp->rx_buf_sz);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3087
			} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3088
				pci_unmap_single(pdev, addr, tp->rx_buf_sz,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3089
						 PCI_DMA_FROMDEVICE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3090
				tp->Rx_skbuff[entry] = NULL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3091
			}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3092
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3093
			skb_put(skb, pkt_size);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3094
			skb->protocol = eth_type_trans(skb, dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3095
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3096
			if (rtl8169_rx_vlan_skb(tp, desc, skb) < 0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3097
				netif_receive_skb(skb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3098
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3099
			dev->last_rx = jiffies;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3100
			dev->stats.rx_bytes += pkt_size;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3101
			dev->stats.rx_packets++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3102
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3103
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3104
		/* Work around for AMD plateform. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3105
		if ((desc->opts2 & cpu_to_le32(0xfffe000)) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3106
		    (tp->mac_version == RTL_GIGA_MAC_VER_05)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3107
			desc->opts2 = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3108
			cur_rx++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3109
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3110
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3111
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3112
	count = cur_rx - tp->cur_rx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3113
	tp->cur_rx = cur_rx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3114
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3115
	delta = rtl8169_rx_fill(tp, dev, tp->dirty_rx, tp->cur_rx);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3116
	if (!delta && count && netif_msg_intr(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3117
		printk(KERN_INFO "%s: no Rx buffer allocated\n", dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3118
	tp->dirty_rx += delta;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3119
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3120
	/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3121
	 * FIXME: until there is periodic timer to try and refill the ring,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3122
	 * a temporary shortage may definitely kill the Rx process.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3123
	 * - disable the asic to try and avoid an overflow and kick it again
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3124
	 *   after refill ?
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3125
	 * - how do others driver handle this condition (Uh oh...).
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3126
	 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3127
	if ((tp->dirty_rx + NUM_RX_DESC == tp->cur_rx) && netif_msg_intr(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3128
		printk(KERN_EMERG "%s: Rx buffers exhausted\n", dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3129
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3130
	return count;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3131
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3132
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3133
static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3134
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3135
	struct net_device *dev = dev_instance;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3136
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3137
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3138
	int handled = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3139
	int status;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3140
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3141
	/* loop handling interrupts until we have no new ones or
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3142
	 * we hit a invalid/hotplug case.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3143
	 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3144
	status = RTL_R16(IntrStatus);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3145
	while (status && status != 0xffff) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3146
		handled = 1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3147
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3148
		/* Handle all of the error cases first. These will reset
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3149
		 * the chip, so just exit the loop.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3150
		 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3151
		if (unlikely(!netif_running(dev))) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3152
			rtl8169_asic_down(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3153
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3154
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3155
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3156
		/* Work around for rx fifo overflow */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3157
		if (unlikely(status & RxFIFOOver) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3158
		(tp->mac_version == RTL_GIGA_MAC_VER_11)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3159
			netif_stop_queue(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3160
			rtl8169_tx_timeout(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3161
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3162
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3163
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3164
		if (unlikely(status & SYSErr)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3165
			rtl8169_pcierr_interrupt(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3166
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3167
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3168
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3169
		if (status & LinkChg)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3170
			rtl8169_check_link_status(dev, tp, ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3171
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3172
		/* We need to see the lastest version of tp->intr_mask to
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3173
		 * avoid ignoring an MSI interrupt and having to wait for
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3174
		 * another event which may never come.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3175
		 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3176
		smp_rmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3177
		if (status & tp->intr_mask & tp->napi_event) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3178
			RTL_W16(IntrMask, tp->intr_event & ~tp->napi_event);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3179
			tp->intr_mask = ~tp->napi_event;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3180
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3181
			if (likely(napi_schedule_prep(&tp->napi)))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3182
				__napi_schedule(&tp->napi);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3183
			else if (netif_msg_intr(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3184
				printk(KERN_INFO "%s: interrupt %04x in poll\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3185
				dev->name, status);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3186
			}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3187
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3188
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3189
		/* We only get a new MSI interrupt when all active irq
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3190
		 * sources on the chip have been acknowledged. So, ack
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3191
		 * everything we've seen and check if new sources have become
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3192
		 * active to avoid blocking all interrupts from the chip.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3193
		 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3194
		RTL_W16(IntrStatus,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3195
			(status & RxFIFOOver) ? (status | RxOverflow) : status);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3196
		status = RTL_R16(IntrStatus);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3197
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3198
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3199
	return IRQ_RETVAL(handled);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3200
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3201
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3202
static int rtl8169_poll(struct napi_struct *napi, int budget)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3203
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3204
	struct rtl8169_private *tp = container_of(napi, struct rtl8169_private, napi);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3205
	struct net_device *dev = tp->dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3206
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3207
	int work_done;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3208
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3209
	work_done = rtl8169_rx_interrupt(dev, tp, ioaddr, (u32) budget);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3210
	rtl8169_tx_interrupt(dev, tp, ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3211
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3212
	if (work_done < budget) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3213
		netif_rx_complete(dev, napi);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3214
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3215
		/* We need for force the visibility of tp->intr_mask
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3216
		 * for other CPUs, as we can loose an MSI interrupt
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3217
		 * and potentially wait for a retransmit timeout if we don't.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3218
		 * The posted write to IntrMask is safe, as it will
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3219
		 * eventually make it to the chip and we won't loose anything
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3220
		 * until it does.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3221
		 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3222
		tp->intr_mask = 0xffff;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3223
		smp_wmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3224
		RTL_W16(IntrMask, tp->intr_event);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3225
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3226
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3227
	return work_done;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3228
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3229
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3230
static void rtl8169_rx_missed(struct net_device *dev, void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3231
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3232
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3233
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3234
	if (tp->mac_version > RTL_GIGA_MAC_VER_06)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3235
		return;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3236
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3237
	dev->stats.rx_missed_errors += (RTL_R32(RxMissed) & 0xffffff);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3238
	RTL_W32(RxMissed, 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3239
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3240
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3241
static void rtl8169_down(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3242
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3243
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3244
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3245
	unsigned int intrmask;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3246
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3247
	rtl8169_delete_timer(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3248
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3249
	netif_stop_queue(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3250
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3251
	napi_disable(&tp->napi);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3252
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3253
core_down:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3254
	spin_lock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3255
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3256
	rtl8169_asic_down(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3257
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3258
	rtl8169_rx_missed(dev, ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3259
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3260
	spin_unlock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3261
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3262
	synchronize_irq(dev->irq);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3263
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3264
	/* Give a racing hard_start_xmit a few cycles to complete. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3265
	synchronize_sched();  /* FIXME: should this be synchronize_irq()? */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3266
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3267
	/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3268
	 * And now for the 50k$ question: are IRQ disabled or not ?
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3269
	 *
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3270
	 * Two paths lead here:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3271
	 * 1) dev->close
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3272
	 *    -> netif_running() is available to sync the current code and the
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3273
	 *       IRQ handler. See rtl8169_interrupt for details.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3274
	 * 2) dev->change_mtu
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3275
	 *    -> rtl8169_poll can not be issued again and re-enable the
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3276
	 *       interruptions. Let's simply issue the IRQ down sequence again.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3277
	 *
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3278
	 * No loop if hotpluged or major error (0xffff).
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3279
	 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3280
	intrmask = RTL_R16(IntrMask);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3281
	if (intrmask && (intrmask != 0xffff))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3282
		goto core_down;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3283
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3284
	rtl8169_tx_clear(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3285
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3286
	rtl8169_rx_clear(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3287
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3288
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3289
static int rtl8169_close(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3290
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3291
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3292
	struct pci_dev *pdev = tp->pci_dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3293
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3294
	/* update counters before going down */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3295
	rtl8169_update_counters(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3296
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3297
	rtl8169_down(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3298
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3299
	free_irq(dev->irq, dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3300
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3301
	pci_free_consistent(pdev, R8169_RX_RING_BYTES, tp->RxDescArray,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3302
			    tp->RxPhyAddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3303
	pci_free_consistent(pdev, R8169_TX_RING_BYTES, tp->TxDescArray,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3304
			    tp->TxPhyAddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3305
	tp->TxDescArray = NULL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3306
	tp->RxDescArray = NULL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3307
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3308
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3309
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3310
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3311
static void rtl_set_rx_mode(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3312
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3313
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3314
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3315
	unsigned long flags;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3316
	u32 mc_filter[2];	/* Multicast hash filter */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3317
	int rx_mode;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3318
	u32 tmp = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3319
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3320
	if (dev->flags & IFF_PROMISC) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3321
		/* Unconditionally log net taps. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3322
		if (netif_msg_link(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3323
			printk(KERN_NOTICE "%s: Promiscuous mode enabled.\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3324
			       dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3325
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3326
		rx_mode =
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3327
		    AcceptBroadcast | AcceptMulticast | AcceptMyPhys |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3328
		    AcceptAllPhys;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3329
		mc_filter[1] = mc_filter[0] = 0xffffffff;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3330
	} else if ((dev->mc_count > multicast_filter_limit)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3331
		   || (dev->flags & IFF_ALLMULTI)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3332
		/* Too many to filter perfectly -- accept all multicasts. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3333
		rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3334
		mc_filter[1] = mc_filter[0] = 0xffffffff;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3335
	} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3336
		struct dev_mc_list *mclist;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3337
		unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3338
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3339
		rx_mode = AcceptBroadcast | AcceptMyPhys;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3340
		mc_filter[1] = mc_filter[0] = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3341
		for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3342
		     i++, mclist = mclist->next) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3343
			int bit_nr = ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3344
			mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3345
			rx_mode |= AcceptMulticast;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3346
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3347
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3348
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3349
	spin_lock_irqsave(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3350
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3351
	tmp = rtl8169_rx_config | rx_mode |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3352
	      (RTL_R32(RxConfig) & rtl_chip_info[tp->chipset].RxConfigMask);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3353
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3354
	if (tp->mac_version > RTL_GIGA_MAC_VER_06) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3355
		u32 data = mc_filter[0];
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3356
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3357
		mc_filter[0] = swab32(mc_filter[1]);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3358
		mc_filter[1] = swab32(data);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3359
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3360
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3361
	RTL_W32(MAR0 + 0, mc_filter[0]);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3362
	RTL_W32(MAR0 + 4, mc_filter[1]);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3363
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3364
	RTL_W32(RxConfig, tmp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3365
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3366
	spin_unlock_irqrestore(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3367
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3368
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3369
/**
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3370
 *  rtl8169_get_stats - Get rtl8169 read/write statistics
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3371
 *  @dev: The Ethernet Device to get statistics for
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3372
 *
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3373
 *  Get TX/RX statistics for rtl8169
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3374
 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3375
static struct net_device_stats *rtl8169_get_stats(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3376
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3377
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3378
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3379
	unsigned long flags;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3380
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3381
	if (netif_running(dev)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3382
		spin_lock_irqsave(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3383
		rtl8169_rx_missed(dev, ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3384
		spin_unlock_irqrestore(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3385
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3386
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3387
	return &dev->stats;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3388
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3389
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3390
#ifdef CONFIG_PM
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3391
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3392
static int rtl8169_suspend(struct pci_dev *pdev, pm_message_t state)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3393
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3394
	struct net_device *dev = pci_get_drvdata(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3395
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3396
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3397
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3398
	if (!netif_running(dev))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3399
		goto out_pci_suspend;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3400
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3401
	netif_device_detach(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3402
	netif_stop_queue(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3403
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3404
	spin_lock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3405
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3406
	rtl8169_asic_down(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3407
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3408
	rtl8169_rx_missed(dev, ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3409
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3410
	spin_unlock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3411
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3412
out_pci_suspend:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3413
	pci_save_state(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3414
	pci_enable_wake(pdev, pci_choose_state(pdev, state),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3415
		(tp->features & RTL_FEATURE_WOL) ? 1 : 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3416
	pci_set_power_state(pdev, pci_choose_state(pdev, state));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3417
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3418
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3419
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3420
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3421
static int rtl8169_resume(struct pci_dev *pdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3422
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3423
	struct net_device *dev = pci_get_drvdata(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3424
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3425
	pci_set_power_state(pdev, PCI_D0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3426
	pci_restore_state(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3427
	pci_enable_wake(pdev, PCI_D0, 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3428
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3429
	if (!netif_running(dev))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3430
		goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3431
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3432
	netif_device_attach(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3433
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3434
	rtl8169_schedule_work(dev, rtl8169_reset_task);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3435
out:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3436
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3437
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3438
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3439
#endif /* CONFIG_PM */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3440
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3441
static struct pci_driver rtl8169_pci_driver = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3442
	.name		= MODULENAME,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3443
	.id_table	= rtl8169_pci_tbl,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3444
	.probe		= rtl8169_init_one,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3445
	.remove		= __devexit_p(rtl8169_remove_one),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3446
#ifdef CONFIG_PM
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3447
	.suspend	= rtl8169_suspend,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3448
	.resume		= rtl8169_resume,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3449
#endif
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3450
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3451
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3452
static int __init rtl8169_init_module(void)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3453
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3454
	return pci_register_driver(&rtl8169_pci_driver);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3455
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3456
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3457
static void __exit rtl8169_cleanup_module(void)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3458
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3459
	pci_unregister_driver(&rtl8169_pci_driver);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3460
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3461
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3462
module_init(rtl8169_init_module);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3463
module_exit(rtl8169_cleanup_module);