devices/r8169-2.6.37-orig.c
author Gavin Lambert <gavinl@compacsort.com>
Tue, 14 Apr 2015 09:33:24 -0400
changeset 2618 3affe9cd0b66
parent 2186 064fe2a6835c
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.
2186
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
 * r8169.c: RealTek 8169/8168/8101 ethernet driver.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
 *
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     4
 * Copyright (c) 2002 ShuChen <shuchen@realtek.com.tw>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     5
 * Copyright (c) 2003 - 2007 Francois Romieu <romieu@fr.zoreil.com>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     6
 * Copyright (c) a lot of people too. Please respect their work.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     7
 *
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     8
 * See MAINTAINERS file for support contact information.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     9
 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    10
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    11
#include <linux/module.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    12
#include <linux/moduleparam.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    13
#include <linux/pci.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    14
#include <linux/netdevice.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    15
#include <linux/etherdevice.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    16
#include <linux/delay.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    17
#include <linux/ethtool.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    18
#include <linux/mii.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    19
#include <linux/if_vlan.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
#include <linux/crc32.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
#include <linux/in.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    22
#include <linux/ip.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    23
#include <linux/tcp.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    24
#include <linux/init.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    25
#include <linux/dma-mapping.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    26
#include <linux/pm_runtime.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    27
#include <linux/pci-aspm.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
#include <asm/system.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
#include <asm/io.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
#include <asm/irq.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
#define RTL8169_VERSION "2.3LK-NAPI"
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
#define MODULENAME "r8169"
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
#define PFX MODULENAME ": "
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    37
#ifdef RTL8169_DEBUG
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    38
#define assert(expr) \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
	if (!(expr)) {					\
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
		printk( "Assertion failed! %s,%s,%s,line=%d\n",	\
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
		#expr,__FILE__,__func__,__LINE__);		\
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
#define dprintk(fmt, args...) \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
	do { printk(KERN_DEBUG PFX fmt, ## args); } while (0)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
#else
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    46
#define assert(expr) do {} while (0)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    47
#define dprintk(fmt, args...)	do {} while (0)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    48
#endif /* RTL8169_DEBUG */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    49
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    50
#define R8169_MSG_DEFAULT \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    51
	(NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_IFUP | NETIF_MSG_IFDOWN)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    53
#define TX_BUFFS_AVAIL(tp) \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    54
	(tp->dirty_tx + NUM_TX_DESC - tp->cur_tx - 1)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    55
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    56
/* Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    57
   The RTL chips use a 64 element hash table based on the Ethernet CRC. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    58
static const int multicast_filter_limit = 32;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
/* MAC address length */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
#define MAC_ADDR_LEN	6
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    63
#define MAX_READ_REQUEST_SHIFT	12
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    64
#define RX_FIFO_THRESH	7	/* 7 means NO threshold, Rx buffer level before first PCI xfer. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    65
#define RX_DMA_BURST	6	/* Maximum PCI burst, '6' is 1024 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    66
#define TX_DMA_BURST	6	/* Maximum PCI burst, '6' is 1024 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    67
#define EarlyTxThld	0x3F	/* 0x3F means NO early transmit */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    68
#define SafeMtu		0x1c20	/* ... actually life sucks beyond ~7k */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    69
#define InterFrameGap	0x03	/* 3 means InterFrameGap = the shortest one */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    71
#define R8169_REGS_SIZE		256
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
#define R8169_NAPI_WEIGHT	64
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    73
#define NUM_TX_DESC	64	/* Number of Tx descriptor registers */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    74
#define NUM_RX_DESC	256	/* Number of Rx descriptor registers */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    75
#define RX_BUF_SIZE	1536	/* Rx Buffer size */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    76
#define R8169_TX_RING_BYTES	(NUM_TX_DESC * sizeof(struct TxDesc))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    77
#define R8169_RX_RING_BYTES	(NUM_RX_DESC * sizeof(struct RxDesc))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
#define RTL8169_TX_TIMEOUT	(6*HZ)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    80
#define RTL8169_PHY_TIMEOUT	(10*HZ)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    81
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    82
#define RTL_EEPROM_SIG		cpu_to_le32(0x8129)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    83
#define RTL_EEPROM_SIG_MASK	cpu_to_le32(0xffff)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    84
#define RTL_EEPROM_SIG_ADDR	0x0000
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    85
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
/* write/read MMIO register */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    87
#define RTL_W8(reg, val8)	writeb ((val8), ioaddr + (reg))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    88
#define RTL_W16(reg, val16)	writew ((val16), ioaddr + (reg))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
#define RTL_W32(reg, val32)	writel ((val32), ioaddr + (reg))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    90
#define RTL_R8(reg)		readb (ioaddr + (reg))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    91
#define RTL_R16(reg)		readw (ioaddr + (reg))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
#define RTL_R32(reg)		readl (ioaddr + (reg))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    93
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    94
enum mac_version {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    95
	RTL_GIGA_MAC_NONE   = 0x00,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
	RTL_GIGA_MAC_VER_01 = 0x01, // 8169
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    97
	RTL_GIGA_MAC_VER_02 = 0x02, // 8169S
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    98
	RTL_GIGA_MAC_VER_03 = 0x03, // 8110S
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    99
	RTL_GIGA_MAC_VER_04 = 0x04, // 8169SB
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   100
	RTL_GIGA_MAC_VER_05 = 0x05, // 8110SCd
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   101
	RTL_GIGA_MAC_VER_06 = 0x06, // 8110SCe
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   102
	RTL_GIGA_MAC_VER_07 = 0x07, // 8102e
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   103
	RTL_GIGA_MAC_VER_08 = 0x08, // 8102e
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   104
	RTL_GIGA_MAC_VER_09 = 0x09, // 8102e
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   105
	RTL_GIGA_MAC_VER_10 = 0x0a, // 8101e
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   106
	RTL_GIGA_MAC_VER_11 = 0x0b, // 8168Bb
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   107
	RTL_GIGA_MAC_VER_12 = 0x0c, // 8168Be
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   108
	RTL_GIGA_MAC_VER_13 = 0x0d, // 8101Eb
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   109
	RTL_GIGA_MAC_VER_14 = 0x0e, // 8101 ?
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   110
	RTL_GIGA_MAC_VER_15 = 0x0f, // 8101 ?
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   111
	RTL_GIGA_MAC_VER_16 = 0x11, // 8101Ec
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   112
	RTL_GIGA_MAC_VER_17 = 0x10, // 8168Bf
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   113
	RTL_GIGA_MAC_VER_18 = 0x12, // 8168CP
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   114
	RTL_GIGA_MAC_VER_19 = 0x13, // 8168C
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   115
	RTL_GIGA_MAC_VER_20 = 0x14, // 8168C
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
	RTL_GIGA_MAC_VER_21 = 0x15, // 8168C
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
	RTL_GIGA_MAC_VER_22 = 0x16, // 8168C
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   118
	RTL_GIGA_MAC_VER_23 = 0x17, // 8168CP
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
	RTL_GIGA_MAC_VER_24 = 0x18, // 8168CP
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
	RTL_GIGA_MAC_VER_25 = 0x19, // 8168D
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   121
	RTL_GIGA_MAC_VER_26 = 0x1a, // 8168D
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
	RTL_GIGA_MAC_VER_27 = 0x1b  // 8168DP
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   123
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   124
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
#define _R(NAME,MAC,MASK) \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   126
	{ .name = NAME, .mac_version = MAC, .RxConfigMask = MASK }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   127
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   128
static const struct {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   129
	const char *name;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   130
	u8 mac_version;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   131
	u32 RxConfigMask;	/* Clears the bits supported by this chip */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   132
} rtl_chip_info[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   133
	_R("RTL8169",		RTL_GIGA_MAC_VER_01, 0xff7e1880), // 8169
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   134
	_R("RTL8169s",		RTL_GIGA_MAC_VER_02, 0xff7e1880), // 8169S
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   135
	_R("RTL8110s",		RTL_GIGA_MAC_VER_03, 0xff7e1880), // 8110S
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   136
	_R("RTL8169sb/8110sb",	RTL_GIGA_MAC_VER_04, 0xff7e1880), // 8169SB
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   137
	_R("RTL8169sc/8110sc",	RTL_GIGA_MAC_VER_05, 0xff7e1880), // 8110SCd
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   138
	_R("RTL8169sc/8110sc",	RTL_GIGA_MAC_VER_06, 0xff7e1880), // 8110SCe
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   139
	_R("RTL8102e",		RTL_GIGA_MAC_VER_07, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   140
	_R("RTL8102e",		RTL_GIGA_MAC_VER_08, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   141
	_R("RTL8102e",		RTL_GIGA_MAC_VER_09, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   142
	_R("RTL8101e",		RTL_GIGA_MAC_VER_10, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   143
	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_11, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   144
	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_12, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   145
	_R("RTL8101e",		RTL_GIGA_MAC_VER_13, 0xff7e1880), // PCI-E 8139
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   146
	_R("RTL8100e",		RTL_GIGA_MAC_VER_14, 0xff7e1880), // PCI-E 8139
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   147
	_R("RTL8100e",		RTL_GIGA_MAC_VER_15, 0xff7e1880), // PCI-E 8139
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   148
	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_17, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   149
	_R("RTL8101e",		RTL_GIGA_MAC_VER_16, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   150
	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_18, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   151
	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_19, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   152
	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_20, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   153
	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_21, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   154
	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_22, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   155
	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_23, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   156
	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_24, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   157
	_R("RTL8168d/8111d",	RTL_GIGA_MAC_VER_25, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   158
	_R("RTL8168d/8111d",	RTL_GIGA_MAC_VER_26, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   159
	_R("RTL8168dp/8111dp",	RTL_GIGA_MAC_VER_27, 0xff7e1880)  // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   160
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   161
#undef _R
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   162
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   163
enum cfg_version {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   164
	RTL_CFG_0 = 0x00,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   165
	RTL_CFG_1,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
	RTL_CFG_2
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   167
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   169
static void rtl_hw_start_8169(struct net_device *);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   170
static void rtl_hw_start_8168(struct net_device *);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   171
static void rtl_hw_start_8101(struct net_device *);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   172
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   173
static DEFINE_PCI_DEVICE_TABLE(rtl8169_pci_tbl) = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   174
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8129), 0, 0, RTL_CFG_0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   175
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8136), 0, 0, RTL_CFG_2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   176
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8167), 0, 0, RTL_CFG_0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   177
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8168), 0, 0, RTL_CFG_1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   178
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8169), 0, 0, RTL_CFG_0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   179
	{ PCI_DEVICE(PCI_VENDOR_ID_DLINK,	0x4300), 0, 0, RTL_CFG_0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   180
	{ PCI_DEVICE(PCI_VENDOR_ID_AT,		0xc107), 0, 0, RTL_CFG_0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   181
	{ PCI_DEVICE(0x16ec,			0x0116), 0, 0, RTL_CFG_0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   182
	{ PCI_VENDOR_ID_LINKSYS,		0x1032,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   183
		PCI_ANY_ID, 0x0024, 0, 0, RTL_CFG_0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   184
	{ 0x0001,				0x8168,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   185
		PCI_ANY_ID, 0x2410, 0, 0, RTL_CFG_2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
	{0,},
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   187
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   188
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   189
MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   190
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   191
static int rx_buf_sz = 16383;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   192
static int use_dac;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
static struct {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   194
	u32 msg_enable;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   195
} debug = { -1 };
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
enum rtl_registers {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   198
	MAC0		= 0,	/* Ethernet hardware address. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
	MAC4		= 4,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   200
	MAR0		= 8,	/* Multicast filter. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   201
	CounterAddrLow		= 0x10,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   202
	CounterAddrHigh		= 0x14,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   203
	TxDescStartAddrLow	= 0x20,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   204
	TxDescStartAddrHigh	= 0x24,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   205
	TxHDescStartAddrLow	= 0x28,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   206
	TxHDescStartAddrHigh	= 0x2c,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   207
	FLASH		= 0x30,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   208
	ERSR		= 0x36,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   209
	ChipCmd		= 0x37,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   210
	TxPoll		= 0x38,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   211
	IntrMask	= 0x3c,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   212
	IntrStatus	= 0x3e,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   213
	TxConfig	= 0x40,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   214
	RxConfig	= 0x44,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   215
	RxMissed	= 0x4c,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   216
	Cfg9346		= 0x50,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   217
	Config0		= 0x51,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   218
	Config1		= 0x52,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   219
	Config2		= 0x53,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   220
	Config3		= 0x54,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   221
	Config4		= 0x55,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   222
	Config5		= 0x56,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   223
	MultiIntr	= 0x5c,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   224
	PHYAR		= 0x60,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   225
	PHYstatus	= 0x6c,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   226
	RxMaxSize	= 0xda,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   227
	CPlusCmd	= 0xe0,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   228
	IntrMitigate	= 0xe2,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   229
	RxDescAddrLow	= 0xe4,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   230
	RxDescAddrHigh	= 0xe8,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   231
	EarlyTxThres	= 0xec,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   232
	FuncEvent	= 0xf0,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   233
	FuncEventMask	= 0xf4,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   234
	FuncPresetState	= 0xf8,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   235
	FuncForceEvent	= 0xfc,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   236
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   237
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   238
enum rtl8110_registers {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   239
	TBICSR			= 0x64,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   240
	TBI_ANAR		= 0x68,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   241
	TBI_LPAR		= 0x6a,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   242
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   243
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   244
enum rtl8168_8101_registers {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   245
	CSIDR			= 0x64,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   246
	CSIAR			= 0x68,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   247
#define	CSIAR_FLAG			0x80000000
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   248
#define	CSIAR_WRITE_CMD			0x80000000
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
#define	CSIAR_BYTE_ENABLE		0x0f
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   250
#define	CSIAR_BYTE_ENABLE_SHIFT		12
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   251
#define	CSIAR_ADDR_MASK			0x0fff
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   252
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   253
	EPHYAR			= 0x80,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   254
#define	EPHYAR_FLAG			0x80000000
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   255
#define	EPHYAR_WRITE_CMD		0x80000000
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   256
#define	EPHYAR_REG_MASK			0x1f
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   257
#define	EPHYAR_REG_SHIFT		16
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   258
#define	EPHYAR_DATA_MASK		0xffff
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   259
	DBG_REG			= 0xd1,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   260
#define	FIX_NAK_1			(1 << 4)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
#define	FIX_NAK_2			(1 << 3)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
	EFUSEAR			= 0xdc,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
#define	EFUSEAR_FLAG			0x80000000
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   264
#define	EFUSEAR_WRITE_CMD		0x80000000
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   265
#define	EFUSEAR_READ_CMD		0x00000000
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   266
#define	EFUSEAR_REG_MASK		0x03ff
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   267
#define	EFUSEAR_REG_SHIFT		8
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   268
#define	EFUSEAR_DATA_MASK		0xff
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   269
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   270
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   271
enum rtl_register_content {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   272
	/* InterruptStatusBits */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   273
	SYSErr		= 0x8000,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
	PCSTimeout	= 0x4000,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   275
	SWInt		= 0x0100,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   276
	TxDescUnavail	= 0x0080,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
	RxFIFOOver	= 0x0040,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
	LinkChg		= 0x0020,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
	RxOverflow	= 0x0010,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   280
	TxErr		= 0x0008,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   281
	TxOK		= 0x0004,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   282
	RxErr		= 0x0002,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   283
	RxOK		= 0x0001,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   284
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   285
	/* RxStatusDesc */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   286
	RxFOVF	= (1 << 23),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   287
	RxRWT	= (1 << 22),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   288
	RxRES	= (1 << 21),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   289
	RxRUNT	= (1 << 20),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   290
	RxCRC	= (1 << 19),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   291
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   292
	/* ChipCmdBits */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   293
	CmdReset	= 0x10,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   294
	CmdRxEnb	= 0x08,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   295
	CmdTxEnb	= 0x04,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   296
	RxBufEmpty	= 0x01,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   297
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   298
	/* TXPoll register p.5 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   299
	HPQ		= 0x80,		/* Poll cmd on the high prio queue */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   300
	NPQ		= 0x40,		/* Poll cmd on the low prio queue */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   301
	FSWInt		= 0x01,		/* Forced software interrupt */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   302
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   303
	/* Cfg9346Bits */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   304
	Cfg9346_Lock	= 0x00,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   305
	Cfg9346_Unlock	= 0xc0,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   306
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   307
	/* rx_mode_bits */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   308
	AcceptErr	= 0x20,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   309
	AcceptRunt	= 0x10,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   310
	AcceptBroadcast	= 0x08,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   311
	AcceptMulticast	= 0x04,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   312
	AcceptMyPhys	= 0x02,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   313
	AcceptAllPhys	= 0x01,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   314
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   315
	/* RxConfigBits */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   316
	RxCfgFIFOShift	= 13,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   317
	RxCfgDMAShift	=  8,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   318
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   319
	/* TxConfigBits */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   320
	TxInterFrameGapShift = 24,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   321
	TxDMAShift = 8,	/* DMA burst value (0-7) is shift this many bits */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   322
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   323
	/* Config1 register p.24 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   324
	LEDS1		= (1 << 7),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   325
	LEDS0		= (1 << 6),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   326
	MSIEnable	= (1 << 5),	/* Enable Message Signaled Interrupt */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   327
	Speed_down	= (1 << 4),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   328
	MEMMAP		= (1 << 3),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   329
	IOMAP		= (1 << 2),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   330
	VPD		= (1 << 1),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   331
	PMEnable	= (1 << 0),	/* Power Management Enable */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   332
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   333
	/* Config2 register p. 25 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   334
	PCI_Clock_66MHz = 0x01,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   335
	PCI_Clock_33MHz = 0x00,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   336
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   337
	/* Config3 register p.25 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   338
	MagicPacket	= (1 << 5),	/* Wake up when receives a Magic Packet */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   339
	LinkUp		= (1 << 4),	/* Wake up when the cable connection is re-established */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   340
	Beacon_en	= (1 << 0),	/* 8168 only. Reserved in the 8168b */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   341
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   342
	/* Config5 register p.27 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   343
	BWF		= (1 << 6),	/* Accept Broadcast wakeup frame */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   344
	MWF		= (1 << 5),	/* Accept Multicast wakeup frame */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   345
	UWF		= (1 << 4),	/* Accept Unicast wakeup frame */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   346
	LanWake		= (1 << 1),	/* LanWake enable/disable */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   347
	PMEStatus	= (1 << 0),	/* PME status can be reset by PCI RST# */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   348
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   349
	/* TBICSR p.28 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   350
	TBIReset	= 0x80000000,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
	TBILoopback	= 0x40000000,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   352
	TBINwEnable	= 0x20000000,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   353
	TBINwRestart	= 0x10000000,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   354
	TBILinkOk	= 0x02000000,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   355
	TBINwComplete	= 0x01000000,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
	/* CPlusCmd p.31 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   358
	EnableBist	= (1 << 15),	// 8168 8101
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
	Mac_dbgo_oe	= (1 << 14),	// 8168 8101
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
	Normal_mode	= (1 << 13),	// unused
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   361
	Force_half_dup	= (1 << 12),	// 8168 8101
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
	Force_rxflow_en	= (1 << 11),	// 8168 8101
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   363
	Force_txflow_en	= (1 << 10),	// 8168 8101
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
	Cxpl_dbg_sel	= (1 << 9),	// 8168 8101
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   365
	ASF		= (1 << 8),	// 8168 8101
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   366
	PktCntrDisable	= (1 << 7),	// 8168 8101
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   367
	Mac_dbgo_sel	= 0x001c,	// 8168
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   368
	RxVlan		= (1 << 6),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   369
	RxChkSum	= (1 << 5),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
	PCIDAC		= (1 << 4),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   371
	PCIMulRW	= (1 << 3),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
	INTT_0		= 0x0000,	// 8168
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
	INTT_1		= 0x0001,	// 8168
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   374
	INTT_2		= 0x0002,	// 8168
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   375
	INTT_3		= 0x0003,	// 8168
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
	/* rtl8169_PHYstatus */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   378
	TBI_Enable	= 0x80,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   379
	TxFlowCtrl	= 0x40,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
	RxFlowCtrl	= 0x20,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
	_1000bpsF	= 0x10,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   382
	_100bps		= 0x08,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   383
	_10bps		= 0x04,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   384
	LinkStatus	= 0x02,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   385
	FullDup		= 0x01,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   386
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   387
	/* _TBICSRBit */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   388
	TBILinkOK	= 0x02000000,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   389
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   390
	/* DumpCounterCommand */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
	CounterDump	= 0x8,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   392
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   393
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   394
enum desc_status_bit {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   395
	DescOwn		= (1 << 31), /* Descriptor is owned by NIC */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   396
	RingEnd		= (1 << 30), /* End of descriptor ring */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   397
	FirstFrag	= (1 << 29), /* First segment of a packet */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   398
	LastFrag	= (1 << 28), /* Final segment of a packet */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   400
	/* Tx private */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   401
	LargeSend	= (1 << 27), /* TCP Large Send Offload (TSO) */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   402
	MSSShift	= 16,        /* MSS value position */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   403
	MSSMask		= 0xfff,     /* MSS value + LargeSend bit: 12 bits */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   404
	IPCS		= (1 << 18), /* Calculate IP checksum */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
	UDPCS		= (1 << 17), /* Calculate UDP/IP checksum */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   406
	TCPCS		= (1 << 16), /* Calculate TCP/IP checksum */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   407
	TxVlanTag	= (1 << 17), /* Add VLAN tag */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   408
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   409
	/* Rx private */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   410
	PID1		= (1 << 18), /* Protocol ID bit 1/2 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   411
	PID0		= (1 << 17), /* Protocol ID bit 2/2 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   412
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   413
#define RxProtoUDP	(PID1)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   414
#define RxProtoTCP	(PID0)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   415
#define RxProtoIP	(PID1 | PID0)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   416
#define RxProtoMask	RxProtoIP
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   417
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   418
	IPFail		= (1 << 16), /* IP checksum failed */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   419
	UDPFail		= (1 << 15), /* UDP/IP checksum failed */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   420
	TCPFail		= (1 << 14), /* TCP/IP checksum failed */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   421
	RxVlanTag	= (1 << 16), /* VLAN tag available */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   422
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   423
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   424
#define RsvdMask	0x3fffc000
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   425
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   426
struct TxDesc {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   427
	__le32 opts1;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   428
	__le32 opts2;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   429
	__le64 addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   430
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   431
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   432
struct RxDesc {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   433
	__le32 opts1;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   434
	__le32 opts2;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   435
	__le64 addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   436
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   437
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   438
struct ring_info {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   439
	struct sk_buff	*skb;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   440
	u32		len;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   441
	u8		__pad[sizeof(void *) - sizeof(u32)];
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   442
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   443
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   444
enum features {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   445
	RTL_FEATURE_WOL		= (1 << 0),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   446
	RTL_FEATURE_MSI		= (1 << 1),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   447
	RTL_FEATURE_GMII	= (1 << 2),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   448
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   449
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   450
struct rtl8169_counters {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   451
	__le64	tx_packets;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   452
	__le64	rx_packets;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   453
	__le64	tx_errors;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   454
	__le32	rx_errors;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   455
	__le16	rx_missed;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   456
	__le16	align_errors;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   457
	__le32	tx_one_collision;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   458
	__le32	tx_multi_collision;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
	__le64	rx_unicast;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   460
	__le64	rx_broadcast;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   461
	__le32	rx_multicast;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   462
	__le16	tx_aborted;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   463
	__le16	tx_underun;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   464
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   465
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   466
struct rtl8169_private {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   467
	void __iomem *mmio_addr;	/* memory map physical address */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   468
	struct pci_dev *pci_dev;	/* Index of PCI device */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   469
	struct net_device *dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   470
	struct napi_struct napi;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   471
	spinlock_t lock;		/* spin lock flag */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   472
	u32 msg_enable;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   473
	int chipset;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   474
	int mac_version;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   475
	u32 cur_rx; /* Index into the Rx descriptor buffer of next Rx pkt. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   476
	u32 cur_tx; /* Index into the Tx descriptor buffer of next Rx pkt. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   477
	u32 dirty_rx;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   478
	u32 dirty_tx;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   479
	struct TxDesc *TxDescArray;	/* 256-aligned Tx descriptor ring */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   480
	struct RxDesc *RxDescArray;	/* 256-aligned Rx descriptor ring */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   481
	dma_addr_t TxPhyAddr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   482
	dma_addr_t RxPhyAddr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   483
	void *Rx_databuff[NUM_RX_DESC];	/* Rx data buffers */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   484
	struct ring_info tx_skb[NUM_TX_DESC];	/* Tx data buffers */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   485
	struct timer_list timer;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   486
	u16 cp_cmd;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   487
	u16 intr_event;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   488
	u16 napi_event;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   489
	u16 intr_mask;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   490
	int phy_1000_ctrl_reg;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   491
#ifdef CONFIG_R8169_VLAN
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   492
	struct vlan_group *vlgrp;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   493
#endif
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   494
	int (*set_speed)(struct net_device *, u8 autoneg, u16 speed, u8 duplex);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   495
	int (*get_settings)(struct net_device *, struct ethtool_cmd *);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   496
	void (*phy_reset_enable)(void __iomem *);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   497
	void (*hw_start)(struct net_device *);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   498
	unsigned int (*phy_reset_pending)(void __iomem *);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   499
	unsigned int (*link_ok)(void __iomem *);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   500
	int (*do_ioctl)(struct rtl8169_private *tp, struct mii_ioctl_data *data, int cmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   501
	int pcie_cap;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   502
	struct delayed_work task;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   503
	unsigned features;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   504
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   505
	struct mii_if_info mii;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   506
	struct rtl8169_counters counters;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   507
	u32 saved_wolopts;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   508
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   509
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   510
MODULE_AUTHOR("Realtek and the Linux r8169 crew <netdev@vger.kernel.org>");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   511
MODULE_DESCRIPTION("RealTek RTL-8169 Gigabit Ethernet driver");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   512
module_param(use_dac, int, 0);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   513
MODULE_PARM_DESC(use_dac, "Enable PCI DAC. Unsafe on 32 bit PCI slot.");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   514
module_param_named(debug, debug.msg_enable, int, 0);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   515
MODULE_PARM_DESC(debug, "Debug verbosity level (0=none, ..., 16=all)");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   516
MODULE_LICENSE("GPL");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   517
MODULE_VERSION(RTL8169_VERSION);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   518
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   519
static int rtl8169_open(struct net_device *dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   520
static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   521
				      struct net_device *dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   522
static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   523
static int rtl8169_init_ring(struct net_device *dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   524
static void rtl_hw_start(struct net_device *dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   525
static int rtl8169_close(struct net_device *dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   526
static void rtl_set_rx_mode(struct net_device *dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   527
static void rtl8169_tx_timeout(struct net_device *dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   528
static struct net_device_stats *rtl8169_get_stats(struct net_device *dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   529
static int rtl8169_rx_interrupt(struct net_device *, struct rtl8169_private *,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   530
				void __iomem *, u32 budget);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   531
static int rtl8169_change_mtu(struct net_device *dev, int new_mtu);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   532
static void rtl8169_down(struct net_device *dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   533
static void rtl8169_rx_clear(struct rtl8169_private *tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   534
static int rtl8169_poll(struct napi_struct *napi, int budget);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   535
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   536
static const unsigned int rtl8169_rx_config =
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   537
	(RX_FIFO_THRESH << RxCfgFIFOShift) | (RX_DMA_BURST << RxCfgDMAShift);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   538
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   539
static void mdio_write(void __iomem *ioaddr, int reg_addr, int value)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   540
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   541
	int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   542
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   543
	RTL_W32(PHYAR, 0x80000000 | (reg_addr & 0x1f) << 16 | (value & 0xffff));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   544
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   545
	for (i = 20; i > 0; i--) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   546
		/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   547
		 * Check if the RTL8169 has completed writing to the specified
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   548
		 * MII register.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   549
		 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   550
		if (!(RTL_R32(PHYAR) & 0x80000000))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   551
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   552
		udelay(25);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   553
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   554
	/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   555
	 * According to hardware specs a 20us delay is required after write
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   556
	 * complete indication, but before sending next command.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   557
	 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   558
	udelay(20);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   559
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   560
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   561
static int mdio_read(void __iomem *ioaddr, int reg_addr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   562
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   563
	int i, value = -1;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   564
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   565
	RTL_W32(PHYAR, 0x0 | (reg_addr & 0x1f) << 16);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   566
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   567
	for (i = 20; i > 0; i--) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   568
		/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   569
		 * Check if the RTL8169 has completed retrieving data from
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   570
		 * the specified MII register.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   571
		 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   572
		if (RTL_R32(PHYAR) & 0x80000000) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   573
			value = RTL_R32(PHYAR) & 0xffff;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   574
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   575
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   576
		udelay(25);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   577
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   578
	/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   579
	 * According to hardware specs a 20us delay is required after read
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   580
	 * complete indication, but before sending next command.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   581
	 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   582
	udelay(20);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   583
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   584
	return value;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   585
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   586
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   587
static void mdio_patch(void __iomem *ioaddr, int reg_addr, int value)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   588
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   589
	mdio_write(ioaddr, reg_addr, mdio_read(ioaddr, reg_addr) | value);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   590
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   591
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   592
static void mdio_plus_minus(void __iomem *ioaddr, int reg_addr, int p, int m)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   593
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   594
	int val;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   595
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   596
	val = mdio_read(ioaddr, reg_addr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   597
	mdio_write(ioaddr, reg_addr, (val | p) & ~m);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   598
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   599
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   600
static void rtl_mdio_write(struct net_device *dev, int phy_id, int location,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   601
			   int val)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   602
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   603
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   604
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   605
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   606
	mdio_write(ioaddr, location, val);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   607
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   608
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   609
static int rtl_mdio_read(struct net_device *dev, int phy_id, int location)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   610
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   611
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   612
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   613
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   614
	return mdio_read(ioaddr, location);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   615
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   616
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   617
static void rtl_ephy_write(void __iomem *ioaddr, int reg_addr, int value)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   618
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   619
	unsigned int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   620
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   621
	RTL_W32(EPHYAR, EPHYAR_WRITE_CMD | (value & EPHYAR_DATA_MASK) |
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   622
		(reg_addr & EPHYAR_REG_MASK) << EPHYAR_REG_SHIFT);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   623
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   624
	for (i = 0; i < 100; i++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   625
		if (!(RTL_R32(EPHYAR) & EPHYAR_FLAG))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   626
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   627
		udelay(10);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   628
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   629
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   630
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   631
static u16 rtl_ephy_read(void __iomem *ioaddr, int reg_addr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   632
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   633
	u16 value = 0xffff;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   634
	unsigned int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   635
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   636
	RTL_W32(EPHYAR, (reg_addr & EPHYAR_REG_MASK) << EPHYAR_REG_SHIFT);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   637
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   638
	for (i = 0; i < 100; i++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   639
		if (RTL_R32(EPHYAR) & EPHYAR_FLAG) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   640
			value = RTL_R32(EPHYAR) & EPHYAR_DATA_MASK;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   641
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   642
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   643
		udelay(10);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   644
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   645
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   646
	return value;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   647
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   648
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   649
static void rtl_csi_write(void __iomem *ioaddr, int addr, int value)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   650
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   651
	unsigned int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   652
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   653
	RTL_W32(CSIDR, value);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   654
	RTL_W32(CSIAR, CSIAR_WRITE_CMD | (addr & CSIAR_ADDR_MASK) |
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   655
		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   656
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   657
	for (i = 0; i < 100; i++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   658
		if (!(RTL_R32(CSIAR) & CSIAR_FLAG))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   659
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   660
		udelay(10);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   661
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   662
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   663
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   664
static u32 rtl_csi_read(void __iomem *ioaddr, int addr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   665
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   666
	u32 value = ~0x00;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   667
	unsigned int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   668
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   669
	RTL_W32(CSIAR, (addr & CSIAR_ADDR_MASK) |
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   670
		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   671
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   672
	for (i = 0; i < 100; i++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   673
		if (RTL_R32(CSIAR) & CSIAR_FLAG) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   674
			value = RTL_R32(CSIDR);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   675
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   676
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   677
		udelay(10);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   678
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   679
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   680
	return value;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   681
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   682
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   683
static u8 rtl8168d_efuse_read(void __iomem *ioaddr, int reg_addr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   684
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   685
	u8 value = 0xff;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   686
	unsigned int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   687
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   688
	RTL_W32(EFUSEAR, (reg_addr & EFUSEAR_REG_MASK) << EFUSEAR_REG_SHIFT);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   689
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   690
	for (i = 0; i < 300; i++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   691
		if (RTL_R32(EFUSEAR) & EFUSEAR_FLAG) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   692
			value = RTL_R32(EFUSEAR) & EFUSEAR_DATA_MASK;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   693
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   694
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   695
		udelay(100);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   696
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   697
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   698
	return value;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   699
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   700
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   701
static void rtl8169_irq_mask_and_ack(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   702
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   703
	RTL_W16(IntrMask, 0x0000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   704
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   705
	RTL_W16(IntrStatus, 0xffff);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   706
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   707
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   708
static void rtl8169_asic_down(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   709
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   710
	RTL_W8(ChipCmd, 0x00);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   711
	rtl8169_irq_mask_and_ack(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   712
	RTL_R16(CPlusCmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   713
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   714
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   715
static unsigned int rtl8169_tbi_reset_pending(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   716
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   717
	return RTL_R32(TBICSR) & TBIReset;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   718
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   719
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   720
static unsigned int rtl8169_xmii_reset_pending(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   721
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   722
	return mdio_read(ioaddr, MII_BMCR) & BMCR_RESET;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   723
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   724
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   725
static unsigned int rtl8169_tbi_link_ok(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   726
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   727
	return RTL_R32(TBICSR) & TBILinkOk;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   728
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   729
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   730
static unsigned int rtl8169_xmii_link_ok(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   731
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   732
	return RTL_R8(PHYstatus) & LinkStatus;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   733
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   734
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   735
static void rtl8169_tbi_reset_enable(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   736
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   737
	RTL_W32(TBICSR, RTL_R32(TBICSR) | TBIReset);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   738
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   739
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   740
static void rtl8169_xmii_reset_enable(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   741
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   742
	unsigned int val;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   743
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   744
	val = mdio_read(ioaddr, MII_BMCR) | BMCR_RESET;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   745
	mdio_write(ioaddr, MII_BMCR, val & 0xffff);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   746
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   747
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   748
static void __rtl8169_check_link_status(struct net_device *dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   749
				      struct rtl8169_private *tp,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   750
				      void __iomem *ioaddr,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   751
				      bool pm)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   752
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   753
	unsigned long flags;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   754
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   755
	spin_lock_irqsave(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   756
	if (tp->link_ok(ioaddr)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   757
		/* This is to cancel a scheduled suspend if there's one. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   758
		if (pm)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   759
			pm_request_resume(&tp->pci_dev->dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   760
		netif_carrier_on(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   761
		if (net_ratelimit())
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   762
			netif_info(tp, ifup, dev, "link up\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   763
	} else {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   764
		netif_carrier_off(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   765
		netif_info(tp, ifdown, dev, "link down\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   766
		if (pm)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   767
			pm_schedule_suspend(&tp->pci_dev->dev, 100);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   768
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   769
	spin_unlock_irqrestore(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   770
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   771
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   772
static void rtl8169_check_link_status(struct net_device *dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   773
				      struct rtl8169_private *tp,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   774
				      void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   775
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   776
	__rtl8169_check_link_status(dev, tp, ioaddr, false);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   777
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   778
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   779
#define WAKE_ANY (WAKE_PHY | WAKE_MAGIC | WAKE_UCAST | WAKE_BCAST | WAKE_MCAST)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   780
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   781
static u32 __rtl8169_get_wol(struct rtl8169_private *tp)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   782
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   783
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   784
	u8 options;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   785
	u32 wolopts = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   786
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   787
	options = RTL_R8(Config1);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   788
	if (!(options & PMEnable))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   789
		return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   790
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   791
	options = RTL_R8(Config3);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   792
	if (options & LinkUp)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   793
		wolopts |= WAKE_PHY;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   794
	if (options & MagicPacket)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   795
		wolopts |= WAKE_MAGIC;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   796
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   797
	options = RTL_R8(Config5);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   798
	if (options & UWF)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   799
		wolopts |= WAKE_UCAST;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   800
	if (options & BWF)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   801
		wolopts |= WAKE_BCAST;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   802
	if (options & MWF)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   803
		wolopts |= WAKE_MCAST;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   804
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   805
	return wolopts;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   806
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   807
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   808
static void rtl8169_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   809
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   810
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   811
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   812
	spin_lock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   813
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   814
	wol->supported = WAKE_ANY;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   815
	wol->wolopts = __rtl8169_get_wol(tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   816
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   817
	spin_unlock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   818
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   819
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   820
static void __rtl8169_set_wol(struct rtl8169_private *tp, u32 wolopts)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   821
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   822
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   823
	unsigned int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   824
	static const struct {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   825
		u32 opt;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   826
		u16 reg;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   827
		u8  mask;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   828
	} cfg[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   829
		{ WAKE_ANY,   Config1, PMEnable },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   830
		{ WAKE_PHY,   Config3, LinkUp },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   831
		{ WAKE_MAGIC, Config3, MagicPacket },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   832
		{ WAKE_UCAST, Config5, UWF },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   833
		{ WAKE_BCAST, Config5, BWF },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   834
		{ WAKE_MCAST, Config5, MWF },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   835
		{ WAKE_ANY,   Config5, LanWake }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   836
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   837
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   838
	RTL_W8(Cfg9346, Cfg9346_Unlock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   839
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   840
	for (i = 0; i < ARRAY_SIZE(cfg); i++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   841
		u8 options = RTL_R8(cfg[i].reg) & ~cfg[i].mask;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   842
		if (wolopts & cfg[i].opt)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   843
			options |= cfg[i].mask;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   844
		RTL_W8(cfg[i].reg, options);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   845
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   846
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   847
	RTL_W8(Cfg9346, Cfg9346_Lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   848
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   849
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   850
static int rtl8169_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   851
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   852
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   853
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   854
	spin_lock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   855
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   856
	if (wol->wolopts)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   857
		tp->features |= RTL_FEATURE_WOL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   858
	else
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   859
		tp->features &= ~RTL_FEATURE_WOL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   860
	__rtl8169_set_wol(tp, wol->wolopts);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   861
	spin_unlock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   862
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   863
	device_set_wakeup_enable(&tp->pci_dev->dev, wol->wolopts);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   864
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   865
	return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   866
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   867
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   868
static void rtl8169_get_drvinfo(struct net_device *dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   869
				struct ethtool_drvinfo *info)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   870
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   871
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   872
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   873
	strcpy(info->driver, MODULENAME);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   874
	strcpy(info->version, RTL8169_VERSION);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   875
	strcpy(info->bus_info, pci_name(tp->pci_dev));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   876
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   877
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   878
static int rtl8169_get_regs_len(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   879
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   880
	return R8169_REGS_SIZE;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   881
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   882
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   883
static int rtl8169_set_speed_tbi(struct net_device *dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   884
				 u8 autoneg, u16 speed, u8 duplex)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   885
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   886
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   887
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   888
	int ret = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   889
	u32 reg;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   890
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   891
	reg = RTL_R32(TBICSR);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   892
	if ((autoneg == AUTONEG_DISABLE) && (speed == SPEED_1000) &&
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   893
	    (duplex == DUPLEX_FULL)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   894
		RTL_W32(TBICSR, reg & ~(TBINwEnable | TBINwRestart));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   895
	} else if (autoneg == AUTONEG_ENABLE)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   896
		RTL_W32(TBICSR, reg | TBINwEnable | TBINwRestart);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   897
	else {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   898
		netif_warn(tp, link, dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   899
			   "incorrect speed setting refused in TBI mode\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   900
		ret = -EOPNOTSUPP;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   901
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   902
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   903
	return ret;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   904
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   905
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   906
static int rtl8169_set_speed_xmii(struct net_device *dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   907
				  u8 autoneg, u16 speed, u8 duplex)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   908
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   909
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   910
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   911
	int giga_ctrl, bmcr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   912
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   913
	if (autoneg == AUTONEG_ENABLE) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   914
		int auto_nego;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   915
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   916
		auto_nego = mdio_read(ioaddr, MII_ADVERTISE);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   917
		auto_nego |= (ADVERTISE_10HALF | ADVERTISE_10FULL |
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   918
			      ADVERTISE_100HALF | ADVERTISE_100FULL);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   919
		auto_nego |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   920
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   921
		giga_ctrl = mdio_read(ioaddr, MII_CTRL1000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   922
		giga_ctrl &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   923
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   924
		/* The 8100e/8101e/8102e do Fast Ethernet only. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   925
		if ((tp->mac_version != RTL_GIGA_MAC_VER_07) &&
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   926
		    (tp->mac_version != RTL_GIGA_MAC_VER_08) &&
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   927
		    (tp->mac_version != RTL_GIGA_MAC_VER_09) &&
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   928
		    (tp->mac_version != RTL_GIGA_MAC_VER_10) &&
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   929
		    (tp->mac_version != RTL_GIGA_MAC_VER_13) &&
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   930
		    (tp->mac_version != RTL_GIGA_MAC_VER_14) &&
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   931
		    (tp->mac_version != RTL_GIGA_MAC_VER_15) &&
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   932
		    (tp->mac_version != RTL_GIGA_MAC_VER_16)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   933
			giga_ctrl |= ADVERTISE_1000FULL | ADVERTISE_1000HALF;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   934
		} else {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   935
			netif_info(tp, link, dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   936
				   "PHY does not support 1000Mbps\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   937
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   938
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   939
		bmcr = BMCR_ANENABLE | BMCR_ANRESTART;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   940
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   941
		if ((tp->mac_version == RTL_GIGA_MAC_VER_11) ||
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   942
		    (tp->mac_version == RTL_GIGA_MAC_VER_12) ||
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   943
		    (tp->mac_version >= RTL_GIGA_MAC_VER_17)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   944
			/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   945
			 * Wake up the PHY.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   946
			 * Vendor specific (0x1f) and reserved (0x0e) MII
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   947
			 * registers.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   948
			 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   949
			mdio_write(ioaddr, 0x1f, 0x0000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   950
			mdio_write(ioaddr, 0x0e, 0x0000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   951
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   952
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   953
		mdio_write(ioaddr, MII_ADVERTISE, auto_nego);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   954
		mdio_write(ioaddr, MII_CTRL1000, giga_ctrl);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   955
	} else {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   956
		giga_ctrl = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   957
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   958
		if (speed == SPEED_10)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   959
			bmcr = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   960
		else if (speed == SPEED_100)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   961
			bmcr = BMCR_SPEED100;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   962
		else
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   963
			return -EINVAL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   964
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   965
		if (duplex == DUPLEX_FULL)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   966
			bmcr |= BMCR_FULLDPLX;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   967
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   968
		mdio_write(ioaddr, 0x1f, 0x0000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   969
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   970
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   971
	tp->phy_1000_ctrl_reg = giga_ctrl;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   972
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   973
	mdio_write(ioaddr, MII_BMCR, bmcr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   974
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   975
	if ((tp->mac_version == RTL_GIGA_MAC_VER_02) ||
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   976
	    (tp->mac_version == RTL_GIGA_MAC_VER_03)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   977
		if ((speed == SPEED_100) && (autoneg != AUTONEG_ENABLE)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   978
			mdio_write(ioaddr, 0x17, 0x2138);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   979
			mdio_write(ioaddr, 0x0e, 0x0260);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   980
		} else {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   981
			mdio_write(ioaddr, 0x17, 0x2108);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   982
			mdio_write(ioaddr, 0x0e, 0x0000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   983
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   984
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   985
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   986
	return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   987
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   988
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   989
static int rtl8169_set_speed(struct net_device *dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   990
			     u8 autoneg, u16 speed, u8 duplex)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   991
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   992
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   993
	int ret;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   994
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   995
	ret = tp->set_speed(dev, autoneg, speed, duplex);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   996
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   997
	if (netif_running(dev) && (tp->phy_1000_ctrl_reg & ADVERTISE_1000FULL))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   998
		mod_timer(&tp->timer, jiffies + RTL8169_PHY_TIMEOUT);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   999
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1000
	return ret;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1001
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1002
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1003
static int rtl8169_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1004
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1005
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1006
	unsigned long flags;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1007
	int ret;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1008
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1009
	spin_lock_irqsave(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1010
	ret = rtl8169_set_speed(dev, cmd->autoneg, cmd->speed, cmd->duplex);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1011
	spin_unlock_irqrestore(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1012
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1013
	return ret;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1014
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1015
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1016
static u32 rtl8169_get_rx_csum(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1017
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1018
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1019
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1020
	return tp->cp_cmd & RxChkSum;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1021
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1022
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1023
static int rtl8169_set_rx_csum(struct net_device *dev, u32 data)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1024
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1025
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1026
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1027
	unsigned long flags;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1028
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1029
	spin_lock_irqsave(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1030
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1031
	if (data)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1032
		tp->cp_cmd |= RxChkSum;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1033
	else
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1034
		tp->cp_cmd &= ~RxChkSum;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1035
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1036
	RTL_W16(CPlusCmd, tp->cp_cmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1037
	RTL_R16(CPlusCmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1038
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1039
	spin_unlock_irqrestore(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1040
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1041
	return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1042
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1043
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1044
#ifdef CONFIG_R8169_VLAN
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1045
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1046
static inline u32 rtl8169_tx_vlan_tag(struct rtl8169_private *tp,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1047
				      struct sk_buff *skb)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1048
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1049
	return (vlan_tx_tag_present(skb)) ?
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1050
		TxVlanTag | swab16(vlan_tx_tag_get(skb)) : 0x00;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1051
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1052
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1053
static void rtl8169_vlan_rx_register(struct net_device *dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1054
				     struct vlan_group *grp)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1055
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1056
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1057
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1058
	unsigned long flags;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1059
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1060
	spin_lock_irqsave(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1061
	tp->vlgrp = grp;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1062
	/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1063
	 * Do not disable RxVlan on 8110SCd.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1064
	 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1065
	if (tp->vlgrp || (tp->mac_version == RTL_GIGA_MAC_VER_05))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1066
		tp->cp_cmd |= RxVlan;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1067
	else
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1068
		tp->cp_cmd &= ~RxVlan;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1069
	RTL_W16(CPlusCmd, tp->cp_cmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1070
	RTL_R16(CPlusCmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1071
	spin_unlock_irqrestore(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1072
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1073
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1074
static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1075
			       struct sk_buff *skb, int polling)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1076
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1077
	u32 opts2 = le32_to_cpu(desc->opts2);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1078
	struct vlan_group *vlgrp = tp->vlgrp;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1079
	int ret;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1080
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1081
	if (vlgrp && (opts2 & RxVlanTag)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1082
		u16 vtag = swab16(opts2 & 0xffff);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1083
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1084
		if (likely(polling))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1085
			vlan_gro_receive(&tp->napi, vlgrp, vtag, skb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1086
		else
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1087
			__vlan_hwaccel_rx(skb, vlgrp, vtag, polling);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1088
		ret = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1089
	} else
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1090
		ret = -1;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1091
	desc->opts2 = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1092
	return ret;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1093
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1094
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1095
#else /* !CONFIG_R8169_VLAN */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1096
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1097
static inline u32 rtl8169_tx_vlan_tag(struct rtl8169_private *tp,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1098
				      struct sk_buff *skb)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1099
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1100
	return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1101
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1102
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1103
static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1104
			       struct sk_buff *skb, int polling)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1105
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1106
	return -1;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1107
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1108
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1109
#endif
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1110
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1111
static int rtl8169_gset_tbi(struct net_device *dev, struct ethtool_cmd *cmd)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1112
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1113
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1114
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1115
	u32 status;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1116
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1117
	cmd->supported =
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1118
		SUPPORTED_1000baseT_Full | SUPPORTED_Autoneg | SUPPORTED_FIBRE;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1119
	cmd->port = PORT_FIBRE;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1120
	cmd->transceiver = XCVR_INTERNAL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1121
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1122
	status = RTL_R32(TBICSR);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1123
	cmd->advertising = (status & TBINwEnable) ?  ADVERTISED_Autoneg : 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1124
	cmd->autoneg = !!(status & TBINwEnable);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1125
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1126
	cmd->speed = SPEED_1000;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1127
	cmd->duplex = DUPLEX_FULL; /* Always set */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1128
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1129
	return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1130
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1131
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1132
static int rtl8169_gset_xmii(struct net_device *dev, struct ethtool_cmd *cmd)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1133
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1134
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1135
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1136
	return mii_ethtool_gset(&tp->mii, cmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1137
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1138
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1139
static int rtl8169_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1140
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1141
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1142
	unsigned long flags;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1143
	int rc;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1144
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1145
	spin_lock_irqsave(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1146
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1147
	rc = tp->get_settings(dev, cmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1148
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1149
	spin_unlock_irqrestore(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1150
	return rc;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1151
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1152
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1153
static void rtl8169_get_regs(struct net_device *dev, struct ethtool_regs *regs,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1154
			     void *p)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1155
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1156
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1157
	unsigned long flags;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1158
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1159
	if (regs->len > R8169_REGS_SIZE)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1160
		regs->len = R8169_REGS_SIZE;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1161
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1162
	spin_lock_irqsave(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1163
	memcpy_fromio(p, tp->mmio_addr, regs->len);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1164
	spin_unlock_irqrestore(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1165
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1166
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1167
static u32 rtl8169_get_msglevel(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1168
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1169
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1170
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1171
	return tp->msg_enable;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1172
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1173
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1174
static void rtl8169_set_msglevel(struct net_device *dev, u32 value)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1175
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1176
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1177
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1178
	tp->msg_enable = value;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1179
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1180
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1181
static const char rtl8169_gstrings[][ETH_GSTRING_LEN] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1182
	"tx_packets",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1183
	"rx_packets",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1184
	"tx_errors",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1185
	"rx_errors",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1186
	"rx_missed",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1187
	"align_errors",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1188
	"tx_single_collisions",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1189
	"tx_multi_collisions",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1190
	"unicast",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1191
	"broadcast",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1192
	"multicast",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1193
	"tx_aborted",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1194
	"tx_underrun",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1195
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1196
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1197
static int rtl8169_get_sset_count(struct net_device *dev, int sset)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1198
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1199
	switch (sset) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1200
	case ETH_SS_STATS:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1201
		return ARRAY_SIZE(rtl8169_gstrings);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1202
	default:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1203
		return -EOPNOTSUPP;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1204
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1205
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1206
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1207
static void rtl8169_update_counters(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1208
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1209
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1210
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1211
	struct rtl8169_counters *counters;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1212
	dma_addr_t paddr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1213
	u32 cmd;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1214
	int wait = 1000;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1215
	struct device *d = &tp->pci_dev->dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1216
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1217
	/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1218
	 * Some chips are unable to dump tally counters when the receiver
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1219
	 * is disabled.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1220
	 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1221
	if ((RTL_R8(ChipCmd) & CmdRxEnb) == 0)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1222
		return;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1223
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1224
	counters = dma_alloc_coherent(d, sizeof(*counters), &paddr, GFP_KERNEL);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1225
	if (!counters)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1226
		return;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1227
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1228
	RTL_W32(CounterAddrHigh, (u64)paddr >> 32);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1229
	cmd = (u64)paddr & DMA_BIT_MASK(32);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1230
	RTL_W32(CounterAddrLow, cmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1231
	RTL_W32(CounterAddrLow, cmd | CounterDump);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1232
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1233
	while (wait--) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1234
		if ((RTL_R32(CounterAddrLow) & CounterDump) == 0) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1235
			/* copy updated counters */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1236
			memcpy(&tp->counters, counters, sizeof(*counters));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1237
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1238
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1239
		udelay(10);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1240
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1241
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1242
	RTL_W32(CounterAddrLow, 0);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1243
	RTL_W32(CounterAddrHigh, 0);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1244
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1245
	dma_free_coherent(d, sizeof(*counters), counters, paddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1246
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1247
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1248
static void rtl8169_get_ethtool_stats(struct net_device *dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1249
				      struct ethtool_stats *stats, u64 *data)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1250
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1251
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1252
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1253
	ASSERT_RTNL();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1254
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1255
	rtl8169_update_counters(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1256
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1257
	data[0] = le64_to_cpu(tp->counters.tx_packets);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1258
	data[1] = le64_to_cpu(tp->counters.rx_packets);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1259
	data[2] = le64_to_cpu(tp->counters.tx_errors);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1260
	data[3] = le32_to_cpu(tp->counters.rx_errors);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1261
	data[4] = le16_to_cpu(tp->counters.rx_missed);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1262
	data[5] = le16_to_cpu(tp->counters.align_errors);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1263
	data[6] = le32_to_cpu(tp->counters.tx_one_collision);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1264
	data[7] = le32_to_cpu(tp->counters.tx_multi_collision);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1265
	data[8] = le64_to_cpu(tp->counters.rx_unicast);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1266
	data[9] = le64_to_cpu(tp->counters.rx_broadcast);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1267
	data[10] = le32_to_cpu(tp->counters.rx_multicast);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1268
	data[11] = le16_to_cpu(tp->counters.tx_aborted);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1269
	data[12] = le16_to_cpu(tp->counters.tx_underun);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1270
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1271
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1272
static void rtl8169_get_strings(struct net_device *dev, u32 stringset, u8 *data)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1273
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1274
	switch(stringset) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1275
	case ETH_SS_STATS:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1276
		memcpy(data, *rtl8169_gstrings, sizeof(rtl8169_gstrings));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1277
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1278
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1279
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1280
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1281
static const struct ethtool_ops rtl8169_ethtool_ops = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1282
	.get_drvinfo		= rtl8169_get_drvinfo,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1283
	.get_regs_len		= rtl8169_get_regs_len,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1284
	.get_link		= ethtool_op_get_link,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1285
	.get_settings		= rtl8169_get_settings,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1286
	.set_settings		= rtl8169_set_settings,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1287
	.get_msglevel		= rtl8169_get_msglevel,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1288
	.set_msglevel		= rtl8169_set_msglevel,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1289
	.get_rx_csum		= rtl8169_get_rx_csum,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1290
	.set_rx_csum		= rtl8169_set_rx_csum,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1291
	.set_tx_csum		= ethtool_op_set_tx_csum,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1292
	.set_sg			= ethtool_op_set_sg,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1293
	.set_tso		= ethtool_op_set_tso,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1294
	.get_regs		= rtl8169_get_regs,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1295
	.get_wol		= rtl8169_get_wol,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1296
	.set_wol		= rtl8169_set_wol,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1297
	.get_strings		= rtl8169_get_strings,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1298
	.get_sset_count		= rtl8169_get_sset_count,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1299
	.get_ethtool_stats	= rtl8169_get_ethtool_stats,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1300
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1301
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1302
static void rtl8169_get_mac_version(struct rtl8169_private *tp,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1303
				    void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1304
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1305
	/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1306
	 * The driver currently handles the 8168Bf and the 8168Be identically
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1307
	 * but they can be identified more specifically through the test below
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1308
	 * if needed:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1309
	 *
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1310
	 * (RTL_R32(TxConfig) & 0x700000) == 0x500000 ? 8168Bf : 8168Be
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1311
	 *
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1312
	 * Same thing for the 8101Eb and the 8101Ec:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1313
	 *
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1314
	 * (RTL_R32(TxConfig) & 0x700000) == 0x200000 ? 8101Eb : 8101Ec
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1315
	 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1316
	static const struct {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1317
		u32 mask;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1318
		u32 val;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1319
		int mac_version;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1320
	} mac_info[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1321
		/* 8168D family. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1322
		{ 0x7cf00000, 0x28300000,	RTL_GIGA_MAC_VER_26 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1323
		{ 0x7cf00000, 0x28100000,	RTL_GIGA_MAC_VER_25 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1324
		{ 0x7c800000, 0x28800000,	RTL_GIGA_MAC_VER_27 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1325
		{ 0x7c800000, 0x28000000,	RTL_GIGA_MAC_VER_26 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1326
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1327
		/* 8168C family. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1328
		{ 0x7cf00000, 0x3cb00000,	RTL_GIGA_MAC_VER_24 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1329
		{ 0x7cf00000, 0x3c900000,	RTL_GIGA_MAC_VER_23 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1330
		{ 0x7cf00000, 0x3c800000,	RTL_GIGA_MAC_VER_18 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1331
		{ 0x7c800000, 0x3c800000,	RTL_GIGA_MAC_VER_24 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1332
		{ 0x7cf00000, 0x3c000000,	RTL_GIGA_MAC_VER_19 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1333
		{ 0x7cf00000, 0x3c200000,	RTL_GIGA_MAC_VER_20 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1334
		{ 0x7cf00000, 0x3c300000,	RTL_GIGA_MAC_VER_21 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1335
		{ 0x7cf00000, 0x3c400000,	RTL_GIGA_MAC_VER_22 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1336
		{ 0x7c800000, 0x3c000000,	RTL_GIGA_MAC_VER_22 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1337
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1338
		/* 8168B family. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1339
		{ 0x7cf00000, 0x38000000,	RTL_GIGA_MAC_VER_12 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1340
		{ 0x7cf00000, 0x38500000,	RTL_GIGA_MAC_VER_17 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1341
		{ 0x7c800000, 0x38000000,	RTL_GIGA_MAC_VER_17 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1342
		{ 0x7c800000, 0x30000000,	RTL_GIGA_MAC_VER_11 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1343
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1344
		/* 8101 family. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1345
		{ 0x7cf00000, 0x34a00000,	RTL_GIGA_MAC_VER_09 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1346
		{ 0x7cf00000, 0x24a00000,	RTL_GIGA_MAC_VER_09 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1347
		{ 0x7cf00000, 0x34900000,	RTL_GIGA_MAC_VER_08 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1348
		{ 0x7cf00000, 0x24900000,	RTL_GIGA_MAC_VER_08 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1349
		{ 0x7cf00000, 0x34800000,	RTL_GIGA_MAC_VER_07 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1350
		{ 0x7cf00000, 0x24800000,	RTL_GIGA_MAC_VER_07 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1351
		{ 0x7cf00000, 0x34000000,	RTL_GIGA_MAC_VER_13 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1352
		{ 0x7cf00000, 0x34300000,	RTL_GIGA_MAC_VER_10 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1353
		{ 0x7cf00000, 0x34200000,	RTL_GIGA_MAC_VER_16 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1354
		{ 0x7c800000, 0x34800000,	RTL_GIGA_MAC_VER_09 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1355
		{ 0x7c800000, 0x24800000,	RTL_GIGA_MAC_VER_09 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1356
		{ 0x7c800000, 0x34000000,	RTL_GIGA_MAC_VER_16 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1357
		/* FIXME: where did these entries come from ? -- FR */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1358
		{ 0xfc800000, 0x38800000,	RTL_GIGA_MAC_VER_15 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1359
		{ 0xfc800000, 0x30800000,	RTL_GIGA_MAC_VER_14 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1360
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1361
		/* 8110 family. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1362
		{ 0xfc800000, 0x98000000,	RTL_GIGA_MAC_VER_06 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1363
		{ 0xfc800000, 0x18000000,	RTL_GIGA_MAC_VER_05 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1364
		{ 0xfc800000, 0x10000000,	RTL_GIGA_MAC_VER_04 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1365
		{ 0xfc800000, 0x04000000,	RTL_GIGA_MAC_VER_03 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1366
		{ 0xfc800000, 0x00800000,	RTL_GIGA_MAC_VER_02 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1367
		{ 0xfc800000, 0x00000000,	RTL_GIGA_MAC_VER_01 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1368
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1369
		/* Catch-all */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1370
		{ 0x00000000, 0x00000000,	RTL_GIGA_MAC_NONE   }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1371
	}, *p = mac_info;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1372
	u32 reg;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1373
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1374
	reg = RTL_R32(TxConfig);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1375
	while ((reg & p->mask) != p->val)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1376
		p++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1377
	tp->mac_version = p->mac_version;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1378
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1379
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1380
static void rtl8169_print_mac_version(struct rtl8169_private *tp)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1381
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1382
	dprintk("mac_version = 0x%02x\n", tp->mac_version);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1383
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1384
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1385
struct phy_reg {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1386
	u16 reg;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1387
	u16 val;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1388
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1389
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1390
static void rtl_phy_write(void __iomem *ioaddr, const struct phy_reg *regs, int len)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1391
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1392
	while (len-- > 0) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1393
		mdio_write(ioaddr, regs->reg, regs->val);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1394
		regs++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1395
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1396
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1397
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1398
static void rtl8169s_hw_phy_config(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1399
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1400
	static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1401
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1402
		{ 0x06, 0x006e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1403
		{ 0x08, 0x0708 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1404
		{ 0x15, 0x4000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1405
		{ 0x18, 0x65c7 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1406
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1407
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1408
		{ 0x03, 0x00a1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1409
		{ 0x02, 0x0008 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1410
		{ 0x01, 0x0120 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1411
		{ 0x00, 0x1000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1412
		{ 0x04, 0x0800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1413
		{ 0x04, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1414
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1415
		{ 0x03, 0xff41 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1416
		{ 0x02, 0xdf60 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1417
		{ 0x01, 0x0140 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1418
		{ 0x00, 0x0077 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1419
		{ 0x04, 0x7800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1420
		{ 0x04, 0x7000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1421
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1422
		{ 0x03, 0x802f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1423
		{ 0x02, 0x4f02 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1424
		{ 0x01, 0x0409 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1425
		{ 0x00, 0xf0f9 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1426
		{ 0x04, 0x9800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1427
		{ 0x04, 0x9000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1428
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1429
		{ 0x03, 0xdf01 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1430
		{ 0x02, 0xdf20 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1431
		{ 0x01, 0xff95 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1432
		{ 0x00, 0xba00 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1433
		{ 0x04, 0xa800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1434
		{ 0x04, 0xa000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1435
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1436
		{ 0x03, 0xff41 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1437
		{ 0x02, 0xdf20 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1438
		{ 0x01, 0x0140 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1439
		{ 0x00, 0x00bb },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1440
		{ 0x04, 0xb800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1441
		{ 0x04, 0xb000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1442
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1443
		{ 0x03, 0xdf41 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1444
		{ 0x02, 0xdc60 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1445
		{ 0x01, 0x6340 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1446
		{ 0x00, 0x007d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1447
		{ 0x04, 0xd800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1448
		{ 0x04, 0xd000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1449
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1450
		{ 0x03, 0xdf01 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1451
		{ 0x02, 0xdf20 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1452
		{ 0x01, 0x100a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1453
		{ 0x00, 0xa0ff },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1454
		{ 0x04, 0xf800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1455
		{ 0x04, 0xf000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1456
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1457
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1458
		{ 0x0b, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1459
		{ 0x00, 0x9200 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1460
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1461
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1462
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1463
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1464
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1465
static void rtl8169sb_hw_phy_config(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1466
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1467
	static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1468
		{ 0x1f, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1469
		{ 0x01, 0x90d0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1470
		{ 0x1f, 0x0000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1471
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1472
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1473
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1474
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1475
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1476
static void rtl8169scd_hw_phy_config_quirk(struct rtl8169_private *tp,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1477
					   void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1478
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1479
	struct pci_dev *pdev = tp->pci_dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1480
	u16 vendor_id, device_id;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1481
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1482
	pci_read_config_word(pdev, PCI_SUBSYSTEM_VENDOR_ID, &vendor_id);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1483
	pci_read_config_word(pdev, PCI_SUBSYSTEM_ID, &device_id);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1484
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1485
	if ((vendor_id != PCI_VENDOR_ID_GIGABYTE) || (device_id != 0xe000))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1486
		return;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1487
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1488
	mdio_write(ioaddr, 0x1f, 0x0001);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1489
	mdio_write(ioaddr, 0x10, 0xf01b);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1490
	mdio_write(ioaddr, 0x1f, 0x0000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1491
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1492
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1493
static void rtl8169scd_hw_phy_config(struct rtl8169_private *tp,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1494
				     void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1495
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1496
	static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1497
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1498
		{ 0x04, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1499
		{ 0x03, 0x00a1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1500
		{ 0x02, 0x0008 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1501
		{ 0x01, 0x0120 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1502
		{ 0x00, 0x1000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1503
		{ 0x04, 0x0800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1504
		{ 0x04, 0x9000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1505
		{ 0x03, 0x802f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1506
		{ 0x02, 0x4f02 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1507
		{ 0x01, 0x0409 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1508
		{ 0x00, 0xf099 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1509
		{ 0x04, 0x9800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1510
		{ 0x04, 0xa000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1511
		{ 0x03, 0xdf01 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1512
		{ 0x02, 0xdf20 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1513
		{ 0x01, 0xff95 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1514
		{ 0x00, 0xba00 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1515
		{ 0x04, 0xa800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1516
		{ 0x04, 0xf000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1517
		{ 0x03, 0xdf01 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1518
		{ 0x02, 0xdf20 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1519
		{ 0x01, 0x101a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1520
		{ 0x00, 0xa0ff },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1521
		{ 0x04, 0xf800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1522
		{ 0x04, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1523
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1524
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1525
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1526
		{ 0x10, 0xf41b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1527
		{ 0x14, 0xfb54 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1528
		{ 0x18, 0xf5c7 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1529
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1530
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1531
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1532
		{ 0x17, 0x0cc0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1533
		{ 0x1f, 0x0000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1534
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1535
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1536
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1537
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1538
	rtl8169scd_hw_phy_config_quirk(tp, ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1539
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1540
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1541
static void rtl8169sce_hw_phy_config(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1542
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1543
	static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1544
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1545
		{ 0x04, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1546
		{ 0x03, 0x00a1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1547
		{ 0x02, 0x0008 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1548
		{ 0x01, 0x0120 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1549
		{ 0x00, 0x1000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1550
		{ 0x04, 0x0800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1551
		{ 0x04, 0x9000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1552
		{ 0x03, 0x802f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1553
		{ 0x02, 0x4f02 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1554
		{ 0x01, 0x0409 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1555
		{ 0x00, 0xf099 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1556
		{ 0x04, 0x9800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1557
		{ 0x04, 0xa000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1558
		{ 0x03, 0xdf01 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1559
		{ 0x02, 0xdf20 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1560
		{ 0x01, 0xff95 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1561
		{ 0x00, 0xba00 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1562
		{ 0x04, 0xa800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1563
		{ 0x04, 0xf000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1564
		{ 0x03, 0xdf01 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1565
		{ 0x02, 0xdf20 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1566
		{ 0x01, 0x101a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1567
		{ 0x00, 0xa0ff },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1568
		{ 0x04, 0xf800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1569
		{ 0x04, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1570
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1571
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1572
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1573
		{ 0x0b, 0x8480 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1574
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1575
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1576
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1577
		{ 0x18, 0x67c7 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1578
		{ 0x04, 0x2000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1579
		{ 0x03, 0x002f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1580
		{ 0x02, 0x4360 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1581
		{ 0x01, 0x0109 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1582
		{ 0x00, 0x3022 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1583
		{ 0x04, 0x2800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1584
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1585
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1586
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1587
		{ 0x17, 0x0cc0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1588
		{ 0x1f, 0x0000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1589
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1590
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1591
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1592
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1593
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1594
static void rtl8168bb_hw_phy_config(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1595
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1596
	static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1597
		{ 0x10, 0xf41b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1598
		{ 0x1f, 0x0000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1599
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1600
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1601
	mdio_write(ioaddr, 0x1f, 0x0001);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1602
	mdio_patch(ioaddr, 0x16, 1 << 0);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1603
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1604
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1605
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1606
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1607
static void rtl8168bef_hw_phy_config(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1608
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1609
	static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1610
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1611
		{ 0x10, 0xf41b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1612
		{ 0x1f, 0x0000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1613
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1614
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1615
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1616
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1617
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1618
static void rtl8168cp_1_hw_phy_config(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1619
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1620
	static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1621
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1622
		{ 0x1d, 0x0f00 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1623
		{ 0x1f, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1624
		{ 0x0c, 0x1ec8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1625
		{ 0x1f, 0x0000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1626
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1627
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1628
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1629
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1630
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1631
static void rtl8168cp_2_hw_phy_config(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1632
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1633
	static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1634
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1635
		{ 0x1d, 0x3d98 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1636
		{ 0x1f, 0x0000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1637
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1638
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1639
	mdio_write(ioaddr, 0x1f, 0x0000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1640
	mdio_patch(ioaddr, 0x14, 1 << 5);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1641
	mdio_patch(ioaddr, 0x0d, 1 << 5);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1642
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1643
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1644
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1645
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1646
static void rtl8168c_1_hw_phy_config(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1647
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1648
	static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1649
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1650
		{ 0x12, 0x2300 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1651
		{ 0x1f, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1652
		{ 0x00, 0x88d4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1653
		{ 0x01, 0x82b1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1654
		{ 0x03, 0x7002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1655
		{ 0x08, 0x9e30 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1656
		{ 0x09, 0x01f0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1657
		{ 0x0a, 0x5500 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1658
		{ 0x0c, 0x00c8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1659
		{ 0x1f, 0x0003 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1660
		{ 0x12, 0xc096 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1661
		{ 0x16, 0x000a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1662
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1663
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1664
		{ 0x09, 0x2000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1665
		{ 0x09, 0x0000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1666
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1667
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1668
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1669
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1670
	mdio_patch(ioaddr, 0x14, 1 << 5);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1671
	mdio_patch(ioaddr, 0x0d, 1 << 5);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1672
	mdio_write(ioaddr, 0x1f, 0x0000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1673
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1674
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1675
static void rtl8168c_2_hw_phy_config(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1676
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1677
	static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1678
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1679
		{ 0x12, 0x2300 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1680
		{ 0x03, 0x802f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1681
		{ 0x02, 0x4f02 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1682
		{ 0x01, 0x0409 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1683
		{ 0x00, 0xf099 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1684
		{ 0x04, 0x9800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1685
		{ 0x04, 0x9000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1686
		{ 0x1d, 0x3d98 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1687
		{ 0x1f, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1688
		{ 0x0c, 0x7eb8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1689
		{ 0x06, 0x0761 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1690
		{ 0x1f, 0x0003 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1691
		{ 0x16, 0x0f0a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1692
		{ 0x1f, 0x0000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1693
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1694
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1695
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1696
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1697
	mdio_patch(ioaddr, 0x16, 1 << 0);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1698
	mdio_patch(ioaddr, 0x14, 1 << 5);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1699
	mdio_patch(ioaddr, 0x0d, 1 << 5);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1700
	mdio_write(ioaddr, 0x1f, 0x0000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1701
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1702
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1703
static void rtl8168c_3_hw_phy_config(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1704
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1705
	static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1706
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1707
		{ 0x12, 0x2300 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1708
		{ 0x1d, 0x3d98 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1709
		{ 0x1f, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1710
		{ 0x0c, 0x7eb8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1711
		{ 0x06, 0x5461 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1712
		{ 0x1f, 0x0003 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1713
		{ 0x16, 0x0f0a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1714
		{ 0x1f, 0x0000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1715
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1716
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1717
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1718
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1719
	mdio_patch(ioaddr, 0x16, 1 << 0);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1720
	mdio_patch(ioaddr, 0x14, 1 << 5);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1721
	mdio_patch(ioaddr, 0x0d, 1 << 5);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1722
	mdio_write(ioaddr, 0x1f, 0x0000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1723
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1724
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1725
static void rtl8168c_4_hw_phy_config(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1726
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1727
	rtl8168c_3_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1728
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1729
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1730
static void rtl8168d_1_hw_phy_config(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1731
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1732
	static const struct phy_reg phy_reg_init_0[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1733
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1734
		{ 0x06, 0x4064 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1735
		{ 0x07, 0x2863 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1736
		{ 0x08, 0x059c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1737
		{ 0x09, 0x26b4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1738
		{ 0x0a, 0x6a19 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1739
		{ 0x0b, 0xdcc8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1740
		{ 0x10, 0xf06d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1741
		{ 0x14, 0x7f68 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1742
		{ 0x18, 0x7fd9 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1743
		{ 0x1c, 0xf0ff },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1744
		{ 0x1d, 0x3d9c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1745
		{ 0x1f, 0x0003 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1746
		{ 0x12, 0xf49f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1747
		{ 0x13, 0x070b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1748
		{ 0x1a, 0x05ad },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1749
		{ 0x14, 0x94c0 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1750
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1751
	static const struct phy_reg phy_reg_init_1[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1752
		{ 0x1f, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1753
		{ 0x06, 0x5561 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1754
		{ 0x1f, 0x0005 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1755
		{ 0x05, 0x8332 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1756
		{ 0x06, 0x5561 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1757
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1758
	static const struct phy_reg phy_reg_init_2[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1759
		{ 0x1f, 0x0005 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1760
		{ 0x05, 0xffc2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1761
		{ 0x1f, 0x0005 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1762
		{ 0x05, 0x8000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1763
		{ 0x06, 0xf8f9 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1764
		{ 0x06, 0xfaef },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1765
		{ 0x06, 0x59ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1766
		{ 0x06, 0xf8ea },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1767
		{ 0x06, 0x00ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1768
		{ 0x06, 0xf8eb },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1769
		{ 0x06, 0x00e0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1770
		{ 0x06, 0xf87c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1771
		{ 0x06, 0xe1f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1772
		{ 0x06, 0x7d59 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1773
		{ 0x06, 0x0fef },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1774
		{ 0x06, 0x0139 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1775
		{ 0x06, 0x029e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1776
		{ 0x06, 0x06ef },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1777
		{ 0x06, 0x1039 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1778
		{ 0x06, 0x089f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1779
		{ 0x06, 0x2aee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1780
		{ 0x06, 0xf8ea },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1781
		{ 0x06, 0x00ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1782
		{ 0x06, 0xf8eb },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1783
		{ 0x06, 0x01e0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1784
		{ 0x06, 0xf87c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1785
		{ 0x06, 0xe1f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1786
		{ 0x06, 0x7d58 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1787
		{ 0x06, 0x409e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1788
		{ 0x06, 0x0f39 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1789
		{ 0x06, 0x46aa },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1790
		{ 0x06, 0x0bbf },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1791
		{ 0x06, 0x8290 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1792
		{ 0x06, 0xd682 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1793
		{ 0x06, 0x9802 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1794
		{ 0x06, 0x014f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1795
		{ 0x06, 0xae09 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1796
		{ 0x06, 0xbf82 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1797
		{ 0x06, 0x98d6 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1798
		{ 0x06, 0x82a0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1799
		{ 0x06, 0x0201 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1800
		{ 0x06, 0x4fef },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1801
		{ 0x06, 0x95fe },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1802
		{ 0x06, 0xfdfc },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1803
		{ 0x06, 0x05f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1804
		{ 0x06, 0xf9fa },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1805
		{ 0x06, 0xeef8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1806
		{ 0x06, 0xea00 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1807
		{ 0x06, 0xeef8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1808
		{ 0x06, 0xeb00 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1809
		{ 0x06, 0xe2f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1810
		{ 0x06, 0x7ce3 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1811
		{ 0x06, 0xf87d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1812
		{ 0x06, 0xa511 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1813
		{ 0x06, 0x1112 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1814
		{ 0x06, 0xd240 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1815
		{ 0x06, 0xd644 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1816
		{ 0x06, 0x4402 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1817
		{ 0x06, 0x8217 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1818
		{ 0x06, 0xd2a0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1819
		{ 0x06, 0xd6aa },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1820
		{ 0x06, 0xaa02 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1821
		{ 0x06, 0x8217 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1822
		{ 0x06, 0xae0f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1823
		{ 0x06, 0xa544 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1824
		{ 0x06, 0x4402 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1825
		{ 0x06, 0xae4d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1826
		{ 0x06, 0xa5aa },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1827
		{ 0x06, 0xaa02 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1828
		{ 0x06, 0xae47 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1829
		{ 0x06, 0xaf82 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1830
		{ 0x06, 0x13ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1831
		{ 0x06, 0x834e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1832
		{ 0x06, 0x00ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1833
		{ 0x06, 0x834d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1834
		{ 0x06, 0x0fee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1835
		{ 0x06, 0x834c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1836
		{ 0x06, 0x0fee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1837
		{ 0x06, 0x834f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1838
		{ 0x06, 0x00ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1839
		{ 0x06, 0x8351 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1840
		{ 0x06, 0x00ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1841
		{ 0x06, 0x834a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1842
		{ 0x06, 0xffee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1843
		{ 0x06, 0x834b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1844
		{ 0x06, 0xffe0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1845
		{ 0x06, 0x8330 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1846
		{ 0x06, 0xe183 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1847
		{ 0x06, 0x3158 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1848
		{ 0x06, 0xfee4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1849
		{ 0x06, 0xf88a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1850
		{ 0x06, 0xe5f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1851
		{ 0x06, 0x8be0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1852
		{ 0x06, 0x8332 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1853
		{ 0x06, 0xe183 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1854
		{ 0x06, 0x3359 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1855
		{ 0x06, 0x0fe2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1856
		{ 0x06, 0x834d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1857
		{ 0x06, 0x0c24 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1858
		{ 0x06, 0x5af0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1859
		{ 0x06, 0x1e12 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1860
		{ 0x06, 0xe4f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1861
		{ 0x06, 0x8ce5 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1862
		{ 0x06, 0xf88d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1863
		{ 0x06, 0xaf82 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1864
		{ 0x06, 0x13e0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1865
		{ 0x06, 0x834f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1866
		{ 0x06, 0x10e4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1867
		{ 0x06, 0x834f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1868
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1869
		{ 0x06, 0x4e78 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1870
		{ 0x06, 0x009f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1871
		{ 0x06, 0x0ae0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1872
		{ 0x06, 0x834f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1873
		{ 0x06, 0xa010 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1874
		{ 0x06, 0xa5ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1875
		{ 0x06, 0x834e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1876
		{ 0x06, 0x01e0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1877
		{ 0x06, 0x834e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1878
		{ 0x06, 0x7805 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1879
		{ 0x06, 0x9e9a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1880
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1881
		{ 0x06, 0x4e78 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1882
		{ 0x06, 0x049e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1883
		{ 0x06, 0x10e0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1884
		{ 0x06, 0x834e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1885
		{ 0x06, 0x7803 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1886
		{ 0x06, 0x9e0f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1887
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1888
		{ 0x06, 0x4e78 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1889
		{ 0x06, 0x019e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1890
		{ 0x06, 0x05ae },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1891
		{ 0x06, 0x0caf },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1892
		{ 0x06, 0x81f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1893
		{ 0x06, 0xaf81 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1894
		{ 0x06, 0xa3af },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1895
		{ 0x06, 0x81dc },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1896
		{ 0x06, 0xaf82 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1897
		{ 0x06, 0x13ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1898
		{ 0x06, 0x8348 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1899
		{ 0x06, 0x00ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1900
		{ 0x06, 0x8349 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1901
		{ 0x06, 0x00e0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1902
		{ 0x06, 0x8351 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1903
		{ 0x06, 0x10e4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1904
		{ 0x06, 0x8351 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1905
		{ 0x06, 0x5801 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1906
		{ 0x06, 0x9fea },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1907
		{ 0x06, 0xd000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1908
		{ 0x06, 0xd180 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1909
		{ 0x06, 0x1f66 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1910
		{ 0x06, 0xe2f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1911
		{ 0x06, 0xeae3 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1912
		{ 0x06, 0xf8eb },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1913
		{ 0x06, 0x5af8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1914
		{ 0x06, 0x1e20 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1915
		{ 0x06, 0xe6f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1916
		{ 0x06, 0xeae5 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1917
		{ 0x06, 0xf8eb },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1918
		{ 0x06, 0xd302 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1919
		{ 0x06, 0xb3fe },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1920
		{ 0x06, 0xe2f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1921
		{ 0x06, 0x7cef },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1922
		{ 0x06, 0x325b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1923
		{ 0x06, 0x80e3 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1924
		{ 0x06, 0xf87d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1925
		{ 0x06, 0x9e03 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1926
		{ 0x06, 0x7dff },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1927
		{ 0x06, 0xff0d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1928
		{ 0x06, 0x581c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1929
		{ 0x06, 0x551a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1930
		{ 0x06, 0x6511 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1931
		{ 0x06, 0xa190 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1932
		{ 0x06, 0xd3e2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1933
		{ 0x06, 0x8348 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1934
		{ 0x06, 0xe383 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1935
		{ 0x06, 0x491b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1936
		{ 0x06, 0x56ab },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1937
		{ 0x06, 0x08ef },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1938
		{ 0x06, 0x56e6 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1939
		{ 0x06, 0x8348 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1940
		{ 0x06, 0xe783 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1941
		{ 0x06, 0x4910 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1942
		{ 0x06, 0xd180 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1943
		{ 0x06, 0x1f66 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1944
		{ 0x06, 0xa004 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1945
		{ 0x06, 0xb9e2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1946
		{ 0x06, 0x8348 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1947
		{ 0x06, 0xe383 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1948
		{ 0x06, 0x49ef },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1949
		{ 0x06, 0x65e2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1950
		{ 0x06, 0x834a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1951
		{ 0x06, 0xe383 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1952
		{ 0x06, 0x4b1b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1953
		{ 0x06, 0x56aa },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1954
		{ 0x06, 0x0eef },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1955
		{ 0x06, 0x56e6 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1956
		{ 0x06, 0x834a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1957
		{ 0x06, 0xe783 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1958
		{ 0x06, 0x4be2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1959
		{ 0x06, 0x834d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1960
		{ 0x06, 0xe683 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1961
		{ 0x06, 0x4ce0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1962
		{ 0x06, 0x834d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1963
		{ 0x06, 0xa000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1964
		{ 0x06, 0x0caf },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1965
		{ 0x06, 0x81dc },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1966
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1967
		{ 0x06, 0x4d10 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1968
		{ 0x06, 0xe483 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1969
		{ 0x06, 0x4dae },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1970
		{ 0x06, 0x0480 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1971
		{ 0x06, 0xe483 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1972
		{ 0x06, 0x4de0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1973
		{ 0x06, 0x834e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1974
		{ 0x06, 0x7803 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1975
		{ 0x06, 0x9e0b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1976
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1977
		{ 0x06, 0x4e78 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1978
		{ 0x06, 0x049e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1979
		{ 0x06, 0x04ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1980
		{ 0x06, 0x834e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1981
		{ 0x06, 0x02e0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1982
		{ 0x06, 0x8332 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1983
		{ 0x06, 0xe183 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1984
		{ 0x06, 0x3359 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1985
		{ 0x06, 0x0fe2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1986
		{ 0x06, 0x834d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1987
		{ 0x06, 0x0c24 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1988
		{ 0x06, 0x5af0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1989
		{ 0x06, 0x1e12 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1990
		{ 0x06, 0xe4f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1991
		{ 0x06, 0x8ce5 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1992
		{ 0x06, 0xf88d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1993
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1994
		{ 0x06, 0x30e1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1995
		{ 0x06, 0x8331 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1996
		{ 0x06, 0x6801 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1997
		{ 0x06, 0xe4f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1998
		{ 0x06, 0x8ae5 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1999
		{ 0x06, 0xf88b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2000
		{ 0x06, 0xae37 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2001
		{ 0x06, 0xee83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2002
		{ 0x06, 0x4e03 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2003
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2004
		{ 0x06, 0x4ce1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2005
		{ 0x06, 0x834d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2006
		{ 0x06, 0x1b01 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2007
		{ 0x06, 0x9e04 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2008
		{ 0x06, 0xaaa1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2009
		{ 0x06, 0xaea8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2010
		{ 0x06, 0xee83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2011
		{ 0x06, 0x4e04 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2012
		{ 0x06, 0xee83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2013
		{ 0x06, 0x4f00 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2014
		{ 0x06, 0xaeab },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2015
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2016
		{ 0x06, 0x4f78 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2017
		{ 0x06, 0x039f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2018
		{ 0x06, 0x14ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2019
		{ 0x06, 0x834e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2020
		{ 0x06, 0x05d2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2021
		{ 0x06, 0x40d6 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2022
		{ 0x06, 0x5554 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2023
		{ 0x06, 0x0282 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2024
		{ 0x06, 0x17d2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2025
		{ 0x06, 0xa0d6 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2026
		{ 0x06, 0xba00 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2027
		{ 0x06, 0x0282 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2028
		{ 0x06, 0x17fe },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2029
		{ 0x06, 0xfdfc },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2030
		{ 0x06, 0x05f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2031
		{ 0x06, 0xe0f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2032
		{ 0x06, 0x60e1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2033
		{ 0x06, 0xf861 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2034
		{ 0x06, 0x6802 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2035
		{ 0x06, 0xe4f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2036
		{ 0x06, 0x60e5 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2037
		{ 0x06, 0xf861 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2038
		{ 0x06, 0xe0f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2039
		{ 0x06, 0x48e1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2040
		{ 0x06, 0xf849 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2041
		{ 0x06, 0x580f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2042
		{ 0x06, 0x1e02 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2043
		{ 0x06, 0xe4f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2044
		{ 0x06, 0x48e5 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2045
		{ 0x06, 0xf849 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2046
		{ 0x06, 0xd000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2047
		{ 0x06, 0x0282 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2048
		{ 0x06, 0x5bbf },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2049
		{ 0x06, 0x8350 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2050
		{ 0x06, 0xef46 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2051
		{ 0x06, 0xdc19 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2052
		{ 0x06, 0xddd0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2053
		{ 0x06, 0x0102 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2054
		{ 0x06, 0x825b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2055
		{ 0x06, 0x0282 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2056
		{ 0x06, 0x77e0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2057
		{ 0x06, 0xf860 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2058
		{ 0x06, 0xe1f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2059
		{ 0x06, 0x6158 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2060
		{ 0x06, 0xfde4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2061
		{ 0x06, 0xf860 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2062
		{ 0x06, 0xe5f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2063
		{ 0x06, 0x61fc },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2064
		{ 0x06, 0x04f9 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2065
		{ 0x06, 0xfafb },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2066
		{ 0x06, 0xc6bf },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2067
		{ 0x06, 0xf840 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2068
		{ 0x06, 0xbe83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2069
		{ 0x06, 0x50a0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2070
		{ 0x06, 0x0101 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2071
		{ 0x06, 0x071b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2072
		{ 0x06, 0x89cf },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2073
		{ 0x06, 0xd208 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2074
		{ 0x06, 0xebdb },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2075
		{ 0x06, 0x19b2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2076
		{ 0x06, 0xfbff },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2077
		{ 0x06, 0xfefd },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2078
		{ 0x06, 0x04f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2079
		{ 0x06, 0xe0f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2080
		{ 0x06, 0x48e1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2081
		{ 0x06, 0xf849 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2082
		{ 0x06, 0x6808 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2083
		{ 0x06, 0xe4f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2084
		{ 0x06, 0x48e5 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2085
		{ 0x06, 0xf849 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2086
		{ 0x06, 0x58f7 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2087
		{ 0x06, 0xe4f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2088
		{ 0x06, 0x48e5 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2089
		{ 0x06, 0xf849 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2090
		{ 0x06, 0xfc04 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2091
		{ 0x06, 0x4d20 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2092
		{ 0x06, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2093
		{ 0x06, 0x4e22 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2094
		{ 0x06, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2095
		{ 0x06, 0x4ddf },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2096
		{ 0x06, 0xff01 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2097
		{ 0x06, 0x4edd },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2098
		{ 0x06, 0xff01 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2099
		{ 0x05, 0x83d4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2100
		{ 0x06, 0x8000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2101
		{ 0x05, 0x83d8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2102
		{ 0x06, 0x8051 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2103
		{ 0x02, 0x6010 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2104
		{ 0x03, 0xdc00 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2105
		{ 0x05, 0xfff6 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2106
		{ 0x06, 0x00fc },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2107
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2108
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2109
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2110
		{ 0x0d, 0xf880 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2111
		{ 0x1f, 0x0000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2112
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2113
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2114
	rtl_phy_write(ioaddr, phy_reg_init_0, ARRAY_SIZE(phy_reg_init_0));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2115
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2116
	mdio_write(ioaddr, 0x1f, 0x0002);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2117
	mdio_plus_minus(ioaddr, 0x0b, 0x0010, 0x00ef);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2118
	mdio_plus_minus(ioaddr, 0x0c, 0xa200, 0x5d00);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2119
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2120
	rtl_phy_write(ioaddr, phy_reg_init_1, ARRAY_SIZE(phy_reg_init_1));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2121
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2122
	if (rtl8168d_efuse_read(ioaddr, 0x01) == 0xb1) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2123
		static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2124
			{ 0x1f, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2125
			{ 0x05, 0x669a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2126
			{ 0x1f, 0x0005 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2127
			{ 0x05, 0x8330 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2128
			{ 0x06, 0x669a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2129
			{ 0x1f, 0x0002 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2130
		};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2131
		int val;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2132
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2133
		rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2134
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2135
		val = mdio_read(ioaddr, 0x0d);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2136
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2137
		if ((val & 0x00ff) != 0x006c) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2138
			static const u32 set[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2139
				0x0065, 0x0066, 0x0067, 0x0068,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2140
				0x0069, 0x006a, 0x006b, 0x006c
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2141
			};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2142
			int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2143
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2144
			mdio_write(ioaddr, 0x1f, 0x0002);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2145
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2146
			val &= 0xff00;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2147
			for (i = 0; i < ARRAY_SIZE(set); i++)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2148
				mdio_write(ioaddr, 0x0d, val | set[i]);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2149
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2150
	} else {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2151
		static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2152
			{ 0x1f, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2153
			{ 0x05, 0x6662 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2154
			{ 0x1f, 0x0005 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2155
			{ 0x05, 0x8330 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2156
			{ 0x06, 0x6662 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2157
		};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2158
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2159
		rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2160
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2161
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2162
	mdio_write(ioaddr, 0x1f, 0x0002);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2163
	mdio_patch(ioaddr, 0x0d, 0x0300);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2164
	mdio_patch(ioaddr, 0x0f, 0x0010);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2165
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2166
	mdio_write(ioaddr, 0x1f, 0x0002);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2167
	mdio_plus_minus(ioaddr, 0x02, 0x0100, 0x0600);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2168
	mdio_plus_minus(ioaddr, 0x03, 0x0000, 0xe000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2169
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2170
	rtl_phy_write(ioaddr, phy_reg_init_2, ARRAY_SIZE(phy_reg_init_2));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2171
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2172
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2173
static void rtl8168d_2_hw_phy_config(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2174
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2175
	static const struct phy_reg phy_reg_init_0[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2176
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2177
		{ 0x06, 0x4064 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2178
		{ 0x07, 0x2863 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2179
		{ 0x08, 0x059c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2180
		{ 0x09, 0x26b4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2181
		{ 0x0a, 0x6a19 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2182
		{ 0x0b, 0xdcc8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2183
		{ 0x10, 0xf06d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2184
		{ 0x14, 0x7f68 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2185
		{ 0x18, 0x7fd9 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2186
		{ 0x1c, 0xf0ff },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2187
		{ 0x1d, 0x3d9c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2188
		{ 0x1f, 0x0003 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2189
		{ 0x12, 0xf49f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2190
		{ 0x13, 0x070b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2191
		{ 0x1a, 0x05ad },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2192
		{ 0x14, 0x94c0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2193
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2194
		{ 0x1f, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2195
		{ 0x06, 0x5561 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2196
		{ 0x1f, 0x0005 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2197
		{ 0x05, 0x8332 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2198
		{ 0x06, 0x5561 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2199
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2200
	static const struct phy_reg phy_reg_init_1[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2201
		{ 0x1f, 0x0005 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2202
		{ 0x05, 0xffc2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2203
		{ 0x1f, 0x0005 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2204
		{ 0x05, 0x8000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2205
		{ 0x06, 0xf8f9 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2206
		{ 0x06, 0xfaee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2207
		{ 0x06, 0xf8ea },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2208
		{ 0x06, 0x00ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2209
		{ 0x06, 0xf8eb },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2210
		{ 0x06, 0x00e2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2211
		{ 0x06, 0xf87c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2212
		{ 0x06, 0xe3f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2213
		{ 0x06, 0x7da5 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2214
		{ 0x06, 0x1111 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2215
		{ 0x06, 0x12d2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2216
		{ 0x06, 0x40d6 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2217
		{ 0x06, 0x4444 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2218
		{ 0x06, 0x0281 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2219
		{ 0x06, 0xc6d2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2220
		{ 0x06, 0xa0d6 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2221
		{ 0x06, 0xaaaa },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2222
		{ 0x06, 0x0281 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2223
		{ 0x06, 0xc6ae },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2224
		{ 0x06, 0x0fa5 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2225
		{ 0x06, 0x4444 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2226
		{ 0x06, 0x02ae },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2227
		{ 0x06, 0x4da5 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2228
		{ 0x06, 0xaaaa },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2229
		{ 0x06, 0x02ae },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2230
		{ 0x06, 0x47af },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2231
		{ 0x06, 0x81c2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2232
		{ 0x06, 0xee83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2233
		{ 0x06, 0x4e00 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2234
		{ 0x06, 0xee83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2235
		{ 0x06, 0x4d0f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2236
		{ 0x06, 0xee83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2237
		{ 0x06, 0x4c0f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2238
		{ 0x06, 0xee83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2239
		{ 0x06, 0x4f00 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2240
		{ 0x06, 0xee83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2241
		{ 0x06, 0x5100 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2242
		{ 0x06, 0xee83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2243
		{ 0x06, 0x4aff },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2244
		{ 0x06, 0xee83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2245
		{ 0x06, 0x4bff },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2246
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2247
		{ 0x06, 0x30e1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2248
		{ 0x06, 0x8331 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2249
		{ 0x06, 0x58fe },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2250
		{ 0x06, 0xe4f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2251
		{ 0x06, 0x8ae5 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2252
		{ 0x06, 0xf88b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2253
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2254
		{ 0x06, 0x32e1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2255
		{ 0x06, 0x8333 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2256
		{ 0x06, 0x590f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2257
		{ 0x06, 0xe283 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2258
		{ 0x06, 0x4d0c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2259
		{ 0x06, 0x245a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2260
		{ 0x06, 0xf01e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2261
		{ 0x06, 0x12e4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2262
		{ 0x06, 0xf88c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2263
		{ 0x06, 0xe5f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2264
		{ 0x06, 0x8daf },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2265
		{ 0x06, 0x81c2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2266
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2267
		{ 0x06, 0x4f10 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2268
		{ 0x06, 0xe483 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2269
		{ 0x06, 0x4fe0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2270
		{ 0x06, 0x834e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2271
		{ 0x06, 0x7800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2272
		{ 0x06, 0x9f0a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2273
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2274
		{ 0x06, 0x4fa0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2275
		{ 0x06, 0x10a5 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2276
		{ 0x06, 0xee83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2277
		{ 0x06, 0x4e01 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2278
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2279
		{ 0x06, 0x4e78 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2280
		{ 0x06, 0x059e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2281
		{ 0x06, 0x9ae0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2282
		{ 0x06, 0x834e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2283
		{ 0x06, 0x7804 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2284
		{ 0x06, 0x9e10 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2285
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2286
		{ 0x06, 0x4e78 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2287
		{ 0x06, 0x039e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2288
		{ 0x06, 0x0fe0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2289
		{ 0x06, 0x834e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2290
		{ 0x06, 0x7801 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2291
		{ 0x06, 0x9e05 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2292
		{ 0x06, 0xae0c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2293
		{ 0x06, 0xaf81 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2294
		{ 0x06, 0xa7af },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2295
		{ 0x06, 0x8152 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2296
		{ 0x06, 0xaf81 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2297
		{ 0x06, 0x8baf },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2298
		{ 0x06, 0x81c2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2299
		{ 0x06, 0xee83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2300
		{ 0x06, 0x4800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2301
		{ 0x06, 0xee83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2302
		{ 0x06, 0x4900 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2303
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2304
		{ 0x06, 0x5110 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2305
		{ 0x06, 0xe483 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2306
		{ 0x06, 0x5158 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2307
		{ 0x06, 0x019f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2308
		{ 0x06, 0xead0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2309
		{ 0x06, 0x00d1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2310
		{ 0x06, 0x801f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2311
		{ 0x06, 0x66e2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2312
		{ 0x06, 0xf8ea },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2313
		{ 0x06, 0xe3f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2314
		{ 0x06, 0xeb5a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2315
		{ 0x06, 0xf81e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2316
		{ 0x06, 0x20e6 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2317
		{ 0x06, 0xf8ea },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2318
		{ 0x06, 0xe5f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2319
		{ 0x06, 0xebd3 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2320
		{ 0x06, 0x02b3 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2321
		{ 0x06, 0xfee2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2322
		{ 0x06, 0xf87c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2323
		{ 0x06, 0xef32 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2324
		{ 0x06, 0x5b80 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2325
		{ 0x06, 0xe3f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2326
		{ 0x06, 0x7d9e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2327
		{ 0x06, 0x037d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2328
		{ 0x06, 0xffff },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2329
		{ 0x06, 0x0d58 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2330
		{ 0x06, 0x1c55 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2331
		{ 0x06, 0x1a65 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2332
		{ 0x06, 0x11a1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2333
		{ 0x06, 0x90d3 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2334
		{ 0x06, 0xe283 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2335
		{ 0x06, 0x48e3 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2336
		{ 0x06, 0x8349 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2337
		{ 0x06, 0x1b56 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2338
		{ 0x06, 0xab08 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2339
		{ 0x06, 0xef56 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2340
		{ 0x06, 0xe683 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2341
		{ 0x06, 0x48e7 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2342
		{ 0x06, 0x8349 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2343
		{ 0x06, 0x10d1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2344
		{ 0x06, 0x801f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2345
		{ 0x06, 0x66a0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2346
		{ 0x06, 0x04b9 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2347
		{ 0x06, 0xe283 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2348
		{ 0x06, 0x48e3 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2349
		{ 0x06, 0x8349 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2350
		{ 0x06, 0xef65 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2351
		{ 0x06, 0xe283 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2352
		{ 0x06, 0x4ae3 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2353
		{ 0x06, 0x834b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2354
		{ 0x06, 0x1b56 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2355
		{ 0x06, 0xaa0e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2356
		{ 0x06, 0xef56 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2357
		{ 0x06, 0xe683 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2358
		{ 0x06, 0x4ae7 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2359
		{ 0x06, 0x834b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2360
		{ 0x06, 0xe283 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2361
		{ 0x06, 0x4de6 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2362
		{ 0x06, 0x834c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2363
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2364
		{ 0x06, 0x4da0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2365
		{ 0x06, 0x000c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2366
		{ 0x06, 0xaf81 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2367
		{ 0x06, 0x8be0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2368
		{ 0x06, 0x834d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2369
		{ 0x06, 0x10e4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2370
		{ 0x06, 0x834d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2371
		{ 0x06, 0xae04 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2372
		{ 0x06, 0x80e4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2373
		{ 0x06, 0x834d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2374
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2375
		{ 0x06, 0x4e78 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2376
		{ 0x06, 0x039e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2377
		{ 0x06, 0x0be0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2378
		{ 0x06, 0x834e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2379
		{ 0x06, 0x7804 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2380
		{ 0x06, 0x9e04 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2381
		{ 0x06, 0xee83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2382
		{ 0x06, 0x4e02 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2383
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2384
		{ 0x06, 0x32e1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2385
		{ 0x06, 0x8333 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2386
		{ 0x06, 0x590f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2387
		{ 0x06, 0xe283 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2388
		{ 0x06, 0x4d0c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2389
		{ 0x06, 0x245a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2390
		{ 0x06, 0xf01e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2391
		{ 0x06, 0x12e4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2392
		{ 0x06, 0xf88c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2393
		{ 0x06, 0xe5f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2394
		{ 0x06, 0x8de0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2395
		{ 0x06, 0x8330 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2396
		{ 0x06, 0xe183 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2397
		{ 0x06, 0x3168 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2398
		{ 0x06, 0x01e4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2399
		{ 0x06, 0xf88a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2400
		{ 0x06, 0xe5f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2401
		{ 0x06, 0x8bae },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2402
		{ 0x06, 0x37ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2403
		{ 0x06, 0x834e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2404
		{ 0x06, 0x03e0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2405
		{ 0x06, 0x834c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2406
		{ 0x06, 0xe183 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2407
		{ 0x06, 0x4d1b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2408
		{ 0x06, 0x019e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2409
		{ 0x06, 0x04aa },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2410
		{ 0x06, 0xa1ae },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2411
		{ 0x06, 0xa8ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2412
		{ 0x06, 0x834e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2413
		{ 0x06, 0x04ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2414
		{ 0x06, 0x834f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2415
		{ 0x06, 0x00ae },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2416
		{ 0x06, 0xabe0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2417
		{ 0x06, 0x834f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2418
		{ 0x06, 0x7803 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2419
		{ 0x06, 0x9f14 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2420
		{ 0x06, 0xee83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2421
		{ 0x06, 0x4e05 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2422
		{ 0x06, 0xd240 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2423
		{ 0x06, 0xd655 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2424
		{ 0x06, 0x5402 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2425
		{ 0x06, 0x81c6 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2426
		{ 0x06, 0xd2a0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2427
		{ 0x06, 0xd6ba },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2428
		{ 0x06, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2429
		{ 0x06, 0x81c6 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2430
		{ 0x06, 0xfefd },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2431
		{ 0x06, 0xfc05 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2432
		{ 0x06, 0xf8e0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2433
		{ 0x06, 0xf860 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2434
		{ 0x06, 0xe1f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2435
		{ 0x06, 0x6168 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2436
		{ 0x06, 0x02e4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2437
		{ 0x06, 0xf860 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2438
		{ 0x06, 0xe5f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2439
		{ 0x06, 0x61e0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2440
		{ 0x06, 0xf848 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2441
		{ 0x06, 0xe1f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2442
		{ 0x06, 0x4958 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2443
		{ 0x06, 0x0f1e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2444
		{ 0x06, 0x02e4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2445
		{ 0x06, 0xf848 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2446
		{ 0x06, 0xe5f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2447
		{ 0x06, 0x49d0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2448
		{ 0x06, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2449
		{ 0x06, 0x820a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2450
		{ 0x06, 0xbf83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2451
		{ 0x06, 0x50ef },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2452
		{ 0x06, 0x46dc },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2453
		{ 0x06, 0x19dd },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2454
		{ 0x06, 0xd001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2455
		{ 0x06, 0x0282 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2456
		{ 0x06, 0x0a02 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2457
		{ 0x06, 0x8226 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2458
		{ 0x06, 0xe0f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2459
		{ 0x06, 0x60e1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2460
		{ 0x06, 0xf861 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2461
		{ 0x06, 0x58fd },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2462
		{ 0x06, 0xe4f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2463
		{ 0x06, 0x60e5 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2464
		{ 0x06, 0xf861 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2465
		{ 0x06, 0xfc04 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2466
		{ 0x06, 0xf9fa },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2467
		{ 0x06, 0xfbc6 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2468
		{ 0x06, 0xbff8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2469
		{ 0x06, 0x40be },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2470
		{ 0x06, 0x8350 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2471
		{ 0x06, 0xa001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2472
		{ 0x06, 0x0107 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2473
		{ 0x06, 0x1b89 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2474
		{ 0x06, 0xcfd2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2475
		{ 0x06, 0x08eb },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2476
		{ 0x06, 0xdb19 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2477
		{ 0x06, 0xb2fb },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2478
		{ 0x06, 0xfffe },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2479
		{ 0x06, 0xfd04 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2480
		{ 0x06, 0xf8e0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2481
		{ 0x06, 0xf848 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2482
		{ 0x06, 0xe1f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2483
		{ 0x06, 0x4968 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2484
		{ 0x06, 0x08e4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2485
		{ 0x06, 0xf848 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2486
		{ 0x06, 0xe5f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2487
		{ 0x06, 0x4958 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2488
		{ 0x06, 0xf7e4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2489
		{ 0x06, 0xf848 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2490
		{ 0x06, 0xe5f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2491
		{ 0x06, 0x49fc },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2492
		{ 0x06, 0x044d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2493
		{ 0x06, 0x2000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2494
		{ 0x06, 0x024e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2495
		{ 0x06, 0x2200 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2496
		{ 0x06, 0x024d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2497
		{ 0x06, 0xdfff },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2498
		{ 0x06, 0x014e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2499
		{ 0x06, 0xddff },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2500
		{ 0x06, 0x0100 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2501
		{ 0x05, 0x83d8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2502
		{ 0x06, 0x8000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2503
		{ 0x03, 0xdc00 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2504
		{ 0x05, 0xfff6 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2505
		{ 0x06, 0x00fc },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2506
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2507
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2508
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2509
		{ 0x0d, 0xf880 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2510
		{ 0x1f, 0x0000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2511
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2512
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2513
	rtl_phy_write(ioaddr, phy_reg_init_0, ARRAY_SIZE(phy_reg_init_0));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2514
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2515
	if (rtl8168d_efuse_read(ioaddr, 0x01) == 0xb1) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2516
		static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2517
			{ 0x1f, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2518
			{ 0x05, 0x669a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2519
			{ 0x1f, 0x0005 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2520
			{ 0x05, 0x8330 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2521
			{ 0x06, 0x669a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2522
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2523
			{ 0x1f, 0x0002 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2524
		};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2525
		int val;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2526
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2527
		rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2528
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2529
		val = mdio_read(ioaddr, 0x0d);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2530
		if ((val & 0x00ff) != 0x006c) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2531
			u32 set[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2532
				0x0065, 0x0066, 0x0067, 0x0068,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2533
				0x0069, 0x006a, 0x006b, 0x006c
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2534
			};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2535
			int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2536
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2537
			mdio_write(ioaddr, 0x1f, 0x0002);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2538
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2539
			val &= 0xff00;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2540
			for (i = 0; i < ARRAY_SIZE(set); i++)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2541
				mdio_write(ioaddr, 0x0d, val | set[i]);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2542
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2543
	} else {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2544
		static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2545
			{ 0x1f, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2546
			{ 0x05, 0x2642 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2547
			{ 0x1f, 0x0005 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2548
			{ 0x05, 0x8330 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2549
			{ 0x06, 0x2642 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2550
		};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2551
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2552
		rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2553
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2554
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2555
	mdio_write(ioaddr, 0x1f, 0x0002);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2556
	mdio_plus_minus(ioaddr, 0x02, 0x0100, 0x0600);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2557
	mdio_plus_minus(ioaddr, 0x03, 0x0000, 0xe000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2558
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2559
	mdio_write(ioaddr, 0x1f, 0x0001);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2560
	mdio_write(ioaddr, 0x17, 0x0cc0);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2561
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2562
	mdio_write(ioaddr, 0x1f, 0x0002);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2563
	mdio_patch(ioaddr, 0x0f, 0x0017);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2564
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2565
	rtl_phy_write(ioaddr, phy_reg_init_1, ARRAY_SIZE(phy_reg_init_1));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2566
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2567
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2568
static void rtl8168d_3_hw_phy_config(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2569
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2570
	static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2571
		{ 0x1f, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2572
		{ 0x10, 0x0008 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2573
		{ 0x0d, 0x006c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2574
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2575
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2576
		{ 0x0d, 0xf880 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2577
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2578
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2579
		{ 0x17, 0x0cc0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2580
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2581
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2582
		{ 0x0b, 0xa4d8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2583
		{ 0x09, 0x281c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2584
		{ 0x07, 0x2883 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2585
		{ 0x0a, 0x6b35 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2586
		{ 0x1d, 0x3da4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2587
		{ 0x1c, 0xeffd },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2588
		{ 0x14, 0x7f52 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2589
		{ 0x18, 0x7fc6 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2590
		{ 0x08, 0x0601 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2591
		{ 0x06, 0x4063 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2592
		{ 0x10, 0xf074 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2593
		{ 0x1f, 0x0003 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2594
		{ 0x13, 0x0789 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2595
		{ 0x12, 0xf4bd },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2596
		{ 0x1a, 0x04fd },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2597
		{ 0x14, 0x84b0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2598
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2599
		{ 0x00, 0x9200 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2600
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2601
		{ 0x1f, 0x0005 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2602
		{ 0x01, 0x0340 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2603
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2604
		{ 0x04, 0x4000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2605
		{ 0x03, 0x1d21 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2606
		{ 0x02, 0x0c32 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2607
		{ 0x01, 0x0200 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2608
		{ 0x00, 0x5554 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2609
		{ 0x04, 0x4800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2610
		{ 0x04, 0x4000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2611
		{ 0x04, 0xf000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2612
		{ 0x03, 0xdf01 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2613
		{ 0x02, 0xdf20 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2614
		{ 0x01, 0x101a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2615
		{ 0x00, 0xa0ff },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2616
		{ 0x04, 0xf800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2617
		{ 0x04, 0xf000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2618
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2619
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2620
		{ 0x1f, 0x0007 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2621
		{ 0x1e, 0x0023 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2622
		{ 0x16, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2623
		{ 0x1f, 0x0000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2624
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2625
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2626
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2627
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2628
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2629
static void rtl8102e_hw_phy_config(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2630
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2631
	static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2632
		{ 0x1f, 0x0003 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2633
		{ 0x08, 0x441d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2634
		{ 0x01, 0x9100 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2635
		{ 0x1f, 0x0000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2636
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2637
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2638
	mdio_write(ioaddr, 0x1f, 0x0000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2639
	mdio_patch(ioaddr, 0x11, 1 << 12);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2640
	mdio_patch(ioaddr, 0x19, 1 << 13);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2641
	mdio_patch(ioaddr, 0x10, 1 << 15);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2642
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2643
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2644
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2645
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2646
static void rtl_hw_phy_config(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2647
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2648
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2649
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2650
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2651
	rtl8169_print_mac_version(tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2652
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2653
	switch (tp->mac_version) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2654
	case RTL_GIGA_MAC_VER_01:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2655
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2656
	case RTL_GIGA_MAC_VER_02:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2657
	case RTL_GIGA_MAC_VER_03:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2658
		rtl8169s_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2659
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2660
	case RTL_GIGA_MAC_VER_04:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2661
		rtl8169sb_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2662
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2663
	case RTL_GIGA_MAC_VER_05:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2664
		rtl8169scd_hw_phy_config(tp, ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2665
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2666
	case RTL_GIGA_MAC_VER_06:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2667
		rtl8169sce_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2668
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2669
	case RTL_GIGA_MAC_VER_07:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2670
	case RTL_GIGA_MAC_VER_08:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2671
	case RTL_GIGA_MAC_VER_09:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2672
		rtl8102e_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2673
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2674
	case RTL_GIGA_MAC_VER_11:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2675
		rtl8168bb_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2676
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2677
	case RTL_GIGA_MAC_VER_12:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2678
		rtl8168bef_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2679
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2680
	case RTL_GIGA_MAC_VER_17:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2681
		rtl8168bef_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2682
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2683
	case RTL_GIGA_MAC_VER_18:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2684
		rtl8168cp_1_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2685
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2686
	case RTL_GIGA_MAC_VER_19:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2687
		rtl8168c_1_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2688
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2689
	case RTL_GIGA_MAC_VER_20:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2690
		rtl8168c_2_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2691
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2692
	case RTL_GIGA_MAC_VER_21:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2693
		rtl8168c_3_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2694
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2695
	case RTL_GIGA_MAC_VER_22:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2696
		rtl8168c_4_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2697
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2698
	case RTL_GIGA_MAC_VER_23:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2699
	case RTL_GIGA_MAC_VER_24:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2700
		rtl8168cp_2_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2701
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2702
	case RTL_GIGA_MAC_VER_25:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2703
		rtl8168d_1_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2704
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2705
	case RTL_GIGA_MAC_VER_26:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2706
		rtl8168d_2_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2707
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2708
	case RTL_GIGA_MAC_VER_27:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2709
		rtl8168d_3_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2710
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2711
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2712
	default:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2713
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2714
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2715
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2716
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2717
static void rtl8169_phy_timer(unsigned long __opaque)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2718
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2719
	struct net_device *dev = (struct net_device *)__opaque;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2720
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2721
	struct timer_list *timer = &tp->timer;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2722
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2723
	unsigned long timeout = RTL8169_PHY_TIMEOUT;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2724
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2725
	assert(tp->mac_version > RTL_GIGA_MAC_VER_01);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2726
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2727
	if (!(tp->phy_1000_ctrl_reg & ADVERTISE_1000FULL))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2728
		return;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2729
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2730
	spin_lock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2731
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2732
	if (tp->phy_reset_pending(ioaddr)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2733
		/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2734
		 * A busy loop could burn quite a few cycles on nowadays CPU.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2735
		 * Let's delay the execution of the timer for a few ticks.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2736
		 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2737
		timeout = HZ/10;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2738
		goto out_mod_timer;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2739
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2740
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2741
	if (tp->link_ok(ioaddr))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2742
		goto out_unlock;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2743
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2744
	netif_warn(tp, link, dev, "PHY reset until link up\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2745
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2746
	tp->phy_reset_enable(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2747
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2748
out_mod_timer:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2749
	mod_timer(timer, jiffies + timeout);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2750
out_unlock:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2751
	spin_unlock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2752
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2753
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2754
static inline void rtl8169_delete_timer(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2755
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2756
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2757
	struct timer_list *timer = &tp->timer;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2758
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2759
	if (tp->mac_version <= RTL_GIGA_MAC_VER_01)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2760
		return;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2761
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2762
	del_timer_sync(timer);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2763
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2764
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2765
static inline void rtl8169_request_timer(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2766
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2767
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2768
	struct timer_list *timer = &tp->timer;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2769
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2770
	if (tp->mac_version <= RTL_GIGA_MAC_VER_01)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2771
		return;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2772
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2773
	mod_timer(timer, jiffies + RTL8169_PHY_TIMEOUT);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2774
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2775
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2776
#ifdef CONFIG_NET_POLL_CONTROLLER
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2777
/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2778
 * Polling 'interrupt' - used by things like netconsole to send skbs
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2779
 * without having to re-enable interrupts. It's not called while
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2780
 * the interrupt routine is executing.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2781
 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2782
static void rtl8169_netpoll(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2783
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2784
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2785
	struct pci_dev *pdev = tp->pci_dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2786
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2787
	disable_irq(pdev->irq);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2788
	rtl8169_interrupt(pdev->irq, dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2789
	enable_irq(pdev->irq);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2790
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2791
#endif
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2792
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2793
static void rtl8169_release_board(struct pci_dev *pdev, struct net_device *dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2794
				  void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2795
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2796
	iounmap(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2797
	pci_release_regions(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2798
	pci_clear_mwi(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2799
	pci_disable_device(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2800
	free_netdev(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2801
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2802
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2803
static void rtl8169_phy_reset(struct net_device *dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2804
			      struct rtl8169_private *tp)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2805
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2806
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2807
	unsigned int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2808
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2809
	tp->phy_reset_enable(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2810
	for (i = 0; i < 100; i++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2811
		if (!tp->phy_reset_pending(ioaddr))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2812
			return;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2813
		msleep(1);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2814
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2815
	netif_err(tp, link, dev, "PHY reset failed\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2816
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2817
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2818
static void rtl8169_init_phy(struct net_device *dev, struct rtl8169_private *tp)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2819
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2820
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2821
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2822
	rtl_hw_phy_config(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2823
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2824
	if (tp->mac_version <= RTL_GIGA_MAC_VER_06) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2825
		dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2826
		RTL_W8(0x82, 0x01);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2827
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2828
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2829
	pci_write_config_byte(tp->pci_dev, PCI_LATENCY_TIMER, 0x40);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2830
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2831
	if (tp->mac_version <= RTL_GIGA_MAC_VER_06)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2832
		pci_write_config_byte(tp->pci_dev, PCI_CACHE_LINE_SIZE, 0x08);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2833
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2834
	if (tp->mac_version == RTL_GIGA_MAC_VER_02) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2835
		dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2836
		RTL_W8(0x82, 0x01);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2837
		dprintk("Set PHY Reg 0x0bh = 0x00h\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2838
		mdio_write(ioaddr, 0x0b, 0x0000); //w 0x0b 15 0 0
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2839
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2840
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2841
	rtl8169_phy_reset(dev, tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2842
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2843
	/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2844
	 * rtl8169_set_speed_xmii takes good care of the Fast Ethernet
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2845
	 * only 8101. Don't panic.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2846
	 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2847
	rtl8169_set_speed(dev, AUTONEG_ENABLE, SPEED_1000, DUPLEX_FULL);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2848
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2849
	if (RTL_R8(PHYstatus) & TBI_Enable)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2850
		netif_info(tp, link, dev, "TBI auto-negotiating\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2851
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2852
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2853
static void rtl_rar_set(struct rtl8169_private *tp, u8 *addr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2854
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2855
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2856
	u32 high;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2857
	u32 low;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2858
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2859
	low  = addr[0] | (addr[1] << 8) | (addr[2] << 16) | (addr[3] << 24);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2860
	high = addr[4] | (addr[5] << 8);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2861
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2862
	spin_lock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2863
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2864
	RTL_W8(Cfg9346, Cfg9346_Unlock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2865
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2866
	RTL_W32(MAC4, high);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2867
	RTL_R32(MAC4);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2868
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2869
	RTL_W32(MAC0, low);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2870
	RTL_R32(MAC0);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2871
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2872
	RTL_W8(Cfg9346, Cfg9346_Lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2873
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2874
	spin_unlock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2875
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2876
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2877
static int rtl_set_mac_address(struct net_device *dev, void *p)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2878
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2879
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2880
	struct sockaddr *addr = p;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2881
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2882
	if (!is_valid_ether_addr(addr->sa_data))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2883
		return -EADDRNOTAVAIL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2884
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2885
	memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2886
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2887
	rtl_rar_set(tp, dev->dev_addr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2888
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2889
	return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2890
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2891
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2892
static int rtl8169_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2893
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2894
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2895
	struct mii_ioctl_data *data = if_mii(ifr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2896
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2897
	return netif_running(dev) ? tp->do_ioctl(tp, data, cmd) : -ENODEV;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2898
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2899
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2900
static int rtl_xmii_ioctl(struct rtl8169_private *tp, struct mii_ioctl_data *data, int cmd)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2901
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2902
	switch (cmd) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2903
	case SIOCGMIIPHY:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2904
		data->phy_id = 32; /* Internal PHY */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2905
		return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2906
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2907
	case SIOCGMIIREG:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2908
		data->val_out = mdio_read(tp->mmio_addr, data->reg_num & 0x1f);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2909
		return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2910
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2911
	case SIOCSMIIREG:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2912
		mdio_write(tp->mmio_addr, data->reg_num & 0x1f, data->val_in);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2913
		return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2914
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2915
	return -EOPNOTSUPP;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2916
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2917
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2918
static int rtl_tbi_ioctl(struct rtl8169_private *tp, struct mii_ioctl_data *data, int cmd)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2919
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2920
	return -EOPNOTSUPP;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2921
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2922
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2923
static const struct rtl_cfg_info {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2924
	void (*hw_start)(struct net_device *);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2925
	unsigned int region;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2926
	unsigned int align;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2927
	u16 intr_event;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2928
	u16 napi_event;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2929
	unsigned features;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2930
	u8 default_ver;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2931
} rtl_cfg_infos [] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2932
	[RTL_CFG_0] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2933
		.hw_start	= rtl_hw_start_8169,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2934
		.region		= 1,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2935
		.align		= 0,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2936
		.intr_event	= SYSErr | LinkChg | RxOverflow |
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2937
				  RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2938
		.napi_event	= RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2939
		.features	= RTL_FEATURE_GMII,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2940
		.default_ver	= RTL_GIGA_MAC_VER_01,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2941
	},
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2942
	[RTL_CFG_1] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2943
		.hw_start	= rtl_hw_start_8168,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2944
		.region		= 2,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2945
		.align		= 8,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2946
		.intr_event	= SYSErr | LinkChg | RxOverflow |
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2947
				  TxErr | TxOK | RxOK | RxErr,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2948
		.napi_event	= TxErr | TxOK | RxOK | RxOverflow,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2949
		.features	= RTL_FEATURE_GMII | RTL_FEATURE_MSI,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2950
		.default_ver	= RTL_GIGA_MAC_VER_11,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2951
	},
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2952
	[RTL_CFG_2] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2953
		.hw_start	= rtl_hw_start_8101,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2954
		.region		= 2,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2955
		.align		= 8,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2956
		.intr_event	= SYSErr | LinkChg | RxOverflow | PCSTimeout |
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2957
				  RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2958
		.napi_event	= RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2959
		.features	= RTL_FEATURE_MSI,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2960
		.default_ver	= RTL_GIGA_MAC_VER_13,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2961
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2962
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2963
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2964
/* Cfg9346_Unlock assumed. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2965
static unsigned rtl_try_msi(struct pci_dev *pdev, void __iomem *ioaddr,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2966
			    const struct rtl_cfg_info *cfg)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2967
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2968
	unsigned msi = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2969
	u8 cfg2;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2970
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2971
	cfg2 = RTL_R8(Config2) & ~MSIEnable;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2972
	if (cfg->features & RTL_FEATURE_MSI) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2973
		if (pci_enable_msi(pdev)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2974
			dev_info(&pdev->dev, "no MSI. Back to INTx.\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2975
		} else {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2976
			cfg2 |= MSIEnable;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2977
			msi = RTL_FEATURE_MSI;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2978
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2979
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2980
	RTL_W8(Config2, cfg2);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2981
	return msi;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2982
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2983
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2984
static void rtl_disable_msi(struct pci_dev *pdev, struct rtl8169_private *tp)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2985
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2986
	if (tp->features & RTL_FEATURE_MSI) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2987
		pci_disable_msi(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2988
		tp->features &= ~RTL_FEATURE_MSI;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2989
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2990
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2991
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2992
static const struct net_device_ops rtl8169_netdev_ops = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2993
	.ndo_open		= rtl8169_open,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2994
	.ndo_stop		= rtl8169_close,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2995
	.ndo_get_stats		= rtl8169_get_stats,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2996
	.ndo_start_xmit		= rtl8169_start_xmit,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2997
	.ndo_tx_timeout		= rtl8169_tx_timeout,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2998
	.ndo_validate_addr	= eth_validate_addr,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2999
	.ndo_change_mtu		= rtl8169_change_mtu,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3000
	.ndo_set_mac_address	= rtl_set_mac_address,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3001
	.ndo_do_ioctl		= rtl8169_ioctl,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3002
	.ndo_set_multicast_list	= rtl_set_rx_mode,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3003
#ifdef CONFIG_R8169_VLAN
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3004
	.ndo_vlan_rx_register	= rtl8169_vlan_rx_register,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3005
#endif
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3006
#ifdef CONFIG_NET_POLL_CONTROLLER
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3007
	.ndo_poll_controller	= rtl8169_netpoll,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3008
#endif
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3009
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3010
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3011
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3012
static int __devinit
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3013
rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3014
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3015
	const struct rtl_cfg_info *cfg = rtl_cfg_infos + ent->driver_data;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3016
	const unsigned int region = cfg->region;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3017
	struct rtl8169_private *tp;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3018
	struct mii_if_info *mii;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3019
	struct net_device *dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3020
	void __iomem *ioaddr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3021
	unsigned int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3022
	int rc;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3023
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3024
	if (netif_msg_drv(&debug)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3025
		printk(KERN_INFO "%s Gigabit Ethernet driver %s loaded\n",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3026
		       MODULENAME, RTL8169_VERSION);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3027
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3028
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3029
	dev = alloc_etherdev(sizeof (*tp));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3030
	if (!dev) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3031
		if (netif_msg_drv(&debug))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3032
			dev_err(&pdev->dev, "unable to alloc new ethernet\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3033
		rc = -ENOMEM;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3034
		goto out;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3035
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3036
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3037
	SET_NETDEV_DEV(dev, &pdev->dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3038
	dev->netdev_ops = &rtl8169_netdev_ops;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3039
	tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3040
	tp->dev = dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3041
	tp->pci_dev = pdev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3042
	tp->msg_enable = netif_msg_init(debug.msg_enable, R8169_MSG_DEFAULT);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3043
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3044
	mii = &tp->mii;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3045
	mii->dev = dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3046
	mii->mdio_read = rtl_mdio_read;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3047
	mii->mdio_write = rtl_mdio_write;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3048
	mii->phy_id_mask = 0x1f;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3049
	mii->reg_num_mask = 0x1f;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3050
	mii->supports_gmii = !!(cfg->features & RTL_FEATURE_GMII);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3051
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3052
	/* disable ASPM completely as that cause random device stop working
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3053
	 * problems as well as full system hangs for some PCIe devices users */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3054
	pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 |
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3055
				     PCIE_LINK_STATE_CLKPM);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3056
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3057
	/* enable device (incl. PCI PM wakeup and hotplug setup) */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3058
	rc = pci_enable_device(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3059
	if (rc < 0) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3060
		netif_err(tp, probe, dev, "enable failure\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3061
		goto err_out_free_dev_1;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3062
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3063
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3064
	if (pci_set_mwi(pdev) < 0)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3065
		netif_info(tp, probe, dev, "Mem-Wr-Inval unavailable\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3066
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3067
	/* make sure PCI base addr 1 is MMIO */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3068
	if (!(pci_resource_flags(pdev, region) & IORESOURCE_MEM)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3069
		netif_err(tp, probe, dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3070
			  "region #%d not an MMIO resource, aborting\n",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3071
			  region);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3072
		rc = -ENODEV;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3073
		goto err_out_mwi_2;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3074
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3075
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3076
	/* check for weird/broken PCI region reporting */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3077
	if (pci_resource_len(pdev, region) < R8169_REGS_SIZE) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3078
		netif_err(tp, probe, dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3079
			  "Invalid PCI region size(s), aborting\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3080
		rc = -ENODEV;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3081
		goto err_out_mwi_2;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3082
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3083
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3084
	rc = pci_request_regions(pdev, MODULENAME);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3085
	if (rc < 0) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3086
		netif_err(tp, probe, dev, "could not request regions\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3087
		goto err_out_mwi_2;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3088
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3089
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3090
	tp->cp_cmd = PCIMulRW | RxChkSum;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3091
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3092
	if ((sizeof(dma_addr_t) > 4) &&
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3093
	    !pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) && use_dac) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3094
		tp->cp_cmd |= PCIDAC;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3095
		dev->features |= NETIF_F_HIGHDMA;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3096
	} else {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3097
		rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3098
		if (rc < 0) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3099
			netif_err(tp, probe, dev, "DMA configuration failed\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3100
			goto err_out_free_res_3;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3101
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3102
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3103
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3104
	/* ioremap MMIO region */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3105
	ioaddr = ioremap(pci_resource_start(pdev, region), R8169_REGS_SIZE);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3106
	if (!ioaddr) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3107
		netif_err(tp, probe, dev, "cannot remap MMIO, aborting\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3108
		rc = -EIO;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3109
		goto err_out_free_res_3;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3110
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3111
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3112
	tp->pcie_cap = pci_find_capability(pdev, PCI_CAP_ID_EXP);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3113
	if (!tp->pcie_cap)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3114
		netif_info(tp, probe, dev, "no PCI Express capability\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3115
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3116
	RTL_W16(IntrMask, 0x0000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3117
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3118
	/* Soft reset the chip. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3119
	RTL_W8(ChipCmd, CmdReset);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3120
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3121
	/* Check that the chip has finished the reset. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3122
	for (i = 0; i < 100; i++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3123
		if ((RTL_R8(ChipCmd) & CmdReset) == 0)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3124
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3125
		msleep_interruptible(1);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3126
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3127
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3128
	RTL_W16(IntrStatus, 0xffff);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3129
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3130
	pci_set_master(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3131
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3132
	/* Identify chip attached to board */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3133
	rtl8169_get_mac_version(tp, ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3134
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3135
	/* Use appropriate default if unknown */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3136
	if (tp->mac_version == RTL_GIGA_MAC_NONE) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3137
		netif_notice(tp, probe, dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3138
			     "unknown MAC, using family default\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3139
		tp->mac_version = cfg->default_ver;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3140
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3141
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3142
	rtl8169_print_mac_version(tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3143
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3144
	for (i = 0; i < ARRAY_SIZE(rtl_chip_info); i++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3145
		if (tp->mac_version == rtl_chip_info[i].mac_version)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3146
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3147
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3148
	if (i == ARRAY_SIZE(rtl_chip_info)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3149
		dev_err(&pdev->dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3150
			"driver bug, MAC version not found in rtl_chip_info\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3151
		goto err_out_msi_4;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3152
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3153
	tp->chipset = i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3154
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3155
	RTL_W8(Cfg9346, Cfg9346_Unlock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3156
	RTL_W8(Config1, RTL_R8(Config1) | PMEnable);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3157
	RTL_W8(Config5, RTL_R8(Config5) & PMEStatus);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3158
	if ((RTL_R8(Config3) & (LinkUp | MagicPacket)) != 0)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3159
		tp->features |= RTL_FEATURE_WOL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3160
	if ((RTL_R8(Config5) & (UWF | BWF | MWF)) != 0)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3161
		tp->features |= RTL_FEATURE_WOL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3162
	tp->features |= rtl_try_msi(pdev, ioaddr, cfg);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3163
	RTL_W8(Cfg9346, Cfg9346_Lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3164
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3165
	if ((tp->mac_version <= RTL_GIGA_MAC_VER_06) &&
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3166
	    (RTL_R8(PHYstatus) & TBI_Enable)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3167
		tp->set_speed = rtl8169_set_speed_tbi;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3168
		tp->get_settings = rtl8169_gset_tbi;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3169
		tp->phy_reset_enable = rtl8169_tbi_reset_enable;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3170
		tp->phy_reset_pending = rtl8169_tbi_reset_pending;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3171
		tp->link_ok = rtl8169_tbi_link_ok;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3172
		tp->do_ioctl = rtl_tbi_ioctl;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3173
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3174
		tp->phy_1000_ctrl_reg = ADVERTISE_1000FULL; /* Implied by TBI */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3175
	} else {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3176
		tp->set_speed = rtl8169_set_speed_xmii;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3177
		tp->get_settings = rtl8169_gset_xmii;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3178
		tp->phy_reset_enable = rtl8169_xmii_reset_enable;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3179
		tp->phy_reset_pending = rtl8169_xmii_reset_pending;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3180
		tp->link_ok = rtl8169_xmii_link_ok;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3181
		tp->do_ioctl = rtl_xmii_ioctl;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3182
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3183
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3184
	spin_lock_init(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3185
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3186
	tp->mmio_addr = ioaddr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3187
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3188
	/* Get MAC address */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3189
	for (i = 0; i < MAC_ADDR_LEN; i++)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3190
		dev->dev_addr[i] = RTL_R8(MAC0 + i);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3191
	memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3192
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3193
	SET_ETHTOOL_OPS(dev, &rtl8169_ethtool_ops);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3194
	dev->watchdog_timeo = RTL8169_TX_TIMEOUT;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3195
	dev->irq = pdev->irq;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3196
	dev->base_addr = (unsigned long) ioaddr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3197
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3198
	netif_napi_add(dev, &tp->napi, rtl8169_poll, R8169_NAPI_WEIGHT);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3199
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3200
#ifdef CONFIG_R8169_VLAN
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3201
	dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3202
#endif
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3203
	dev->features |= NETIF_F_GRO;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3204
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3205
	tp->intr_mask = 0xffff;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3206
	tp->hw_start = cfg->hw_start;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3207
	tp->intr_event = cfg->intr_event;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3208
	tp->napi_event = cfg->napi_event;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3209
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3210
	init_timer(&tp->timer);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3211
	tp->timer.data = (unsigned long) dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3212
	tp->timer.function = rtl8169_phy_timer;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3213
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3214
	rc = register_netdev(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3215
	if (rc < 0)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3216
		goto err_out_msi_4;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3217
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3218
	pci_set_drvdata(pdev, dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3219
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3220
	netif_info(tp, probe, dev, "%s at 0x%lx, %pM, XID %08x IRQ %d\n",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3221
		   rtl_chip_info[tp->chipset].name,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3222
		   dev->base_addr, dev->dev_addr,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3223
		   (u32)(RTL_R32(TxConfig) & 0x9cf0f8ff), dev->irq);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3224
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3225
	rtl8169_init_phy(dev, tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3226
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3227
	/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3228
	 * Pretend we are using VLANs; This bypasses a nasty bug where
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3229
	 * Interrupts stop flowing on high load on 8110SCd controllers.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3230
	 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3231
	if (tp->mac_version == RTL_GIGA_MAC_VER_05)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3232
		RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) | RxVlan);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3233
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3234
	device_set_wakeup_enable(&pdev->dev, tp->features & RTL_FEATURE_WOL);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3235
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3236
	if (pci_dev_run_wake(pdev))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3237
		pm_runtime_put_noidle(&pdev->dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3238
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3239
	netif_carrier_off(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3240
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3241
out:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3242
	return rc;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3243
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3244
err_out_msi_4:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3245
	rtl_disable_msi(pdev, tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3246
	iounmap(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3247
err_out_free_res_3:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3248
	pci_release_regions(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3249
err_out_mwi_2:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3250
	pci_clear_mwi(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3251
	pci_disable_device(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3252
err_out_free_dev_1:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3253
	free_netdev(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3254
	goto out;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3255
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3256
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3257
static void __devexit rtl8169_remove_one(struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3258
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3259
	struct net_device *dev = pci_get_drvdata(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3260
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3261
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3262
	flush_scheduled_work();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3263
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3264
	unregister_netdev(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3265
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3266
	if (pci_dev_run_wake(pdev))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3267
		pm_runtime_get_noresume(&pdev->dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3268
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3269
	/* restore original MAC address */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3270
	rtl_rar_set(tp, dev->perm_addr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3271
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3272
	rtl_disable_msi(pdev, tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3273
	rtl8169_release_board(pdev, dev, tp->mmio_addr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3274
	pci_set_drvdata(pdev, NULL);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3275
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3276
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3277
static int rtl8169_open(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3278
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3279
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3280
	struct pci_dev *pdev = tp->pci_dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3281
	int retval = -ENOMEM;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3282
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3283
	pm_runtime_get_sync(&pdev->dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3284
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3285
	/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3286
	 * Rx and Tx desscriptors needs 256 bytes alignment.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3287
	 * dma_alloc_coherent provides more.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3288
	 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3289
	tp->TxDescArray = dma_alloc_coherent(&pdev->dev, R8169_TX_RING_BYTES,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3290
					     &tp->TxPhyAddr, GFP_KERNEL);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3291
	if (!tp->TxDescArray)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3292
		goto err_pm_runtime_put;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3293
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3294
	tp->RxDescArray = dma_alloc_coherent(&pdev->dev, R8169_RX_RING_BYTES,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3295
					     &tp->RxPhyAddr, GFP_KERNEL);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3296
	if (!tp->RxDescArray)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3297
		goto err_free_tx_0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3298
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3299
	retval = rtl8169_init_ring(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3300
	if (retval < 0)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3301
		goto err_free_rx_1;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3302
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3303
	INIT_DELAYED_WORK(&tp->task, NULL);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3304
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3305
	smp_mb();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3306
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3307
	retval = request_irq(dev->irq, rtl8169_interrupt,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3308
			     (tp->features & RTL_FEATURE_MSI) ? 0 : IRQF_SHARED,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3309
			     dev->name, dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3310
	if (retval < 0)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3311
		goto err_release_ring_2;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3312
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3313
	napi_enable(&tp->napi);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3314
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3315
	rtl_hw_start(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3316
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3317
	rtl8169_request_timer(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3318
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3319
	tp->saved_wolopts = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3320
	pm_runtime_put_noidle(&pdev->dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3321
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3322
	rtl8169_check_link_status(dev, tp, tp->mmio_addr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3323
out:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3324
	return retval;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3325
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3326
err_release_ring_2:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3327
	rtl8169_rx_clear(tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3328
err_free_rx_1:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3329
	dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3330
			  tp->RxPhyAddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3331
	tp->RxDescArray = NULL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3332
err_free_tx_0:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3333
	dma_free_coherent(&pdev->dev, R8169_TX_RING_BYTES, tp->TxDescArray,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3334
			  tp->TxPhyAddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3335
	tp->TxDescArray = NULL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3336
err_pm_runtime_put:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3337
	pm_runtime_put_noidle(&pdev->dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3338
	goto out;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3339
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3340
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3341
static void rtl8169_hw_reset(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3342
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3343
	/* Disable interrupts */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3344
	rtl8169_irq_mask_and_ack(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3345
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3346
	/* Reset the chipset */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3347
	RTL_W8(ChipCmd, CmdReset);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3348
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3349
	/* PCI commit */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3350
	RTL_R8(ChipCmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3351
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3352
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3353
static void rtl_set_rx_tx_config_registers(struct rtl8169_private *tp)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3354
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3355
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3356
	u32 cfg = rtl8169_rx_config;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3357
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3358
	cfg |= (RTL_R32(RxConfig) & rtl_chip_info[tp->chipset].RxConfigMask);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3359
	RTL_W32(RxConfig, cfg);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3360
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3361
	/* Set DMA burst size and Interframe Gap Time */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3362
	RTL_W32(TxConfig, (TX_DMA_BURST << TxDMAShift) |
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3363
		(InterFrameGap << TxInterFrameGapShift));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3364
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3365
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3366
static void rtl_hw_start(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3367
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3368
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3369
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3370
	unsigned int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3371
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3372
	/* Soft reset the chip. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3373
	RTL_W8(ChipCmd, CmdReset);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3374
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3375
	/* Check that the chip has finished the reset. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3376
	for (i = 0; i < 100; i++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3377
		if ((RTL_R8(ChipCmd) & CmdReset) == 0)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3378
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3379
		msleep_interruptible(1);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3380
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3381
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3382
	tp->hw_start(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3383
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3384
	netif_start_queue(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3385
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3386
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3387
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3388
static void rtl_set_rx_tx_desc_registers(struct rtl8169_private *tp,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3389
					 void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3390
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3391
	/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3392
	 * Magic spell: some iop3xx ARM board needs the TxDescAddrHigh
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3393
	 * register to be written before TxDescAddrLow to work.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3394
	 * Switching from MMIO to I/O access fixes the issue as well.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3395
	 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3396
	RTL_W32(TxDescStartAddrHigh, ((u64) tp->TxPhyAddr) >> 32);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3397
	RTL_W32(TxDescStartAddrLow, ((u64) tp->TxPhyAddr) & DMA_BIT_MASK(32));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3398
	RTL_W32(RxDescAddrHigh, ((u64) tp->RxPhyAddr) >> 32);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3399
	RTL_W32(RxDescAddrLow, ((u64) tp->RxPhyAddr) & DMA_BIT_MASK(32));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3400
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3401
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3402
static u16 rtl_rw_cpluscmd(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3403
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3404
	u16 cmd;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3405
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3406
	cmd = RTL_R16(CPlusCmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3407
	RTL_W16(CPlusCmd, cmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3408
	return cmd;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3409
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3410
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3411
static void rtl_set_rx_max_size(void __iomem *ioaddr, unsigned int rx_buf_sz)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3412
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3413
	/* Low hurts. Let's disable the filtering. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3414
	RTL_W16(RxMaxSize, rx_buf_sz + 1);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3415
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3416
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3417
static void rtl8169_set_magic_reg(void __iomem *ioaddr, unsigned mac_version)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3418
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3419
	static const struct {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3420
		u32 mac_version;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3421
		u32 clk;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3422
		u32 val;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3423
	} cfg2_info [] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3424
		{ RTL_GIGA_MAC_VER_05, PCI_Clock_33MHz, 0x000fff00 }, // 8110SCd
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3425
		{ RTL_GIGA_MAC_VER_05, PCI_Clock_66MHz, 0x000fffff },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3426
		{ RTL_GIGA_MAC_VER_06, PCI_Clock_33MHz, 0x00ffff00 }, // 8110SCe
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3427
		{ RTL_GIGA_MAC_VER_06, PCI_Clock_66MHz, 0x00ffffff }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3428
	}, *p = cfg2_info;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3429
	unsigned int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3430
	u32 clk;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3431
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3432
	clk = RTL_R8(Config2) & PCI_Clock_66MHz;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3433
	for (i = 0; i < ARRAY_SIZE(cfg2_info); i++, p++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3434
		if ((p->mac_version == mac_version) && (p->clk == clk)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3435
			RTL_W32(0x7c, p->val);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3436
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3437
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3438
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3439
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3440
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3441
static void rtl_hw_start_8169(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3442
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3443
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3444
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3445
	struct pci_dev *pdev = tp->pci_dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3446
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3447
	if (tp->mac_version == RTL_GIGA_MAC_VER_05) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3448
		RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) | PCIMulRW);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3449
		pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, 0x08);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3450
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3451
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3452
	RTL_W8(Cfg9346, Cfg9346_Unlock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3453
	if ((tp->mac_version == RTL_GIGA_MAC_VER_01) ||
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3454
	    (tp->mac_version == RTL_GIGA_MAC_VER_02) ||
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3455
	    (tp->mac_version == RTL_GIGA_MAC_VER_03) ||
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3456
	    (tp->mac_version == RTL_GIGA_MAC_VER_04))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3457
		RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3458
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3459
	RTL_W8(EarlyTxThres, EarlyTxThld);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3460
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3461
	rtl_set_rx_max_size(ioaddr, rx_buf_sz);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3462
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3463
	if ((tp->mac_version == RTL_GIGA_MAC_VER_01) ||
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3464
	    (tp->mac_version == RTL_GIGA_MAC_VER_02) ||
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3465
	    (tp->mac_version == RTL_GIGA_MAC_VER_03) ||
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3466
	    (tp->mac_version == RTL_GIGA_MAC_VER_04))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3467
		rtl_set_rx_tx_config_registers(tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3468
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3469
	tp->cp_cmd |= rtl_rw_cpluscmd(ioaddr) | PCIMulRW;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3470
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3471
	if ((tp->mac_version == RTL_GIGA_MAC_VER_02) ||
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3472
	    (tp->mac_version == RTL_GIGA_MAC_VER_03)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3473
		dprintk("Set MAC Reg C+CR Offset 0xE0. "
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3474
			"Bit-3 and bit-14 MUST be 1\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3475
		tp->cp_cmd |= (1 << 14);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3476
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3477
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3478
	RTL_W16(CPlusCmd, tp->cp_cmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3479
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3480
	rtl8169_set_magic_reg(ioaddr, tp->mac_version);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3481
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3482
	/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3483
	 * Undocumented corner. Supposedly:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3484
	 * (TxTimer << 12) | (TxPackets << 8) | (RxTimer << 4) | RxPackets
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3485
	 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3486
	RTL_W16(IntrMitigate, 0x0000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3487
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3488
	rtl_set_rx_tx_desc_registers(tp, ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3489
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3490
	if ((tp->mac_version != RTL_GIGA_MAC_VER_01) &&
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3491
	    (tp->mac_version != RTL_GIGA_MAC_VER_02) &&
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3492
	    (tp->mac_version != RTL_GIGA_MAC_VER_03) &&
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3493
	    (tp->mac_version != RTL_GIGA_MAC_VER_04)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3494
		RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3495
		rtl_set_rx_tx_config_registers(tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3496
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3497
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3498
	RTL_W8(Cfg9346, Cfg9346_Lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3499
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3500
	/* Initially a 10 us delay. Turned it into a PCI commit. - FR */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3501
	RTL_R8(IntrMask);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3502
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3503
	RTL_W32(RxMissed, 0);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3504
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3505
	rtl_set_rx_mode(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3506
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3507
	/* no early-rx interrupts */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3508
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xF000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3509
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3510
	/* Enable all known interrupts by setting the interrupt mask. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3511
	RTL_W16(IntrMask, tp->intr_event);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3512
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3513
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3514
static void rtl_tx_performance_tweak(struct pci_dev *pdev, u16 force)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3515
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3516
	struct net_device *dev = pci_get_drvdata(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3517
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3518
	int cap = tp->pcie_cap;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3519
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3520
	if (cap) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3521
		u16 ctl;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3522
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3523
		pci_read_config_word(pdev, cap + PCI_EXP_DEVCTL, &ctl);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3524
		ctl = (ctl & ~PCI_EXP_DEVCTL_READRQ) | force;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3525
		pci_write_config_word(pdev, cap + PCI_EXP_DEVCTL, ctl);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3526
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3527
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3528
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3529
static void rtl_csi_access_enable(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3530
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3531
	u32 csi;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3532
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3533
	csi = rtl_csi_read(ioaddr, 0x070c) & 0x00ffffff;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3534
	rtl_csi_write(ioaddr, 0x070c, csi | 0x27000000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3535
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3536
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3537
struct ephy_info {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3538
	unsigned int offset;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3539
	u16 mask;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3540
	u16 bits;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3541
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3542
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3543
static void rtl_ephy_init(void __iomem *ioaddr, const struct ephy_info *e, int len)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3544
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3545
	u16 w;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3546
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3547
	while (len-- > 0) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3548
		w = (rtl_ephy_read(ioaddr, e->offset) & ~e->mask) | e->bits;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3549
		rtl_ephy_write(ioaddr, e->offset, w);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3550
		e++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3551
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3552
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3553
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3554
static void rtl_disable_clock_request(struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3555
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3556
	struct net_device *dev = pci_get_drvdata(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3557
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3558
	int cap = tp->pcie_cap;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3559
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3560
	if (cap) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3561
		u16 ctl;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3562
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3563
		pci_read_config_word(pdev, cap + PCI_EXP_LNKCTL, &ctl);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3564
		ctl &= ~PCI_EXP_LNKCTL_CLKREQ_EN;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3565
		pci_write_config_word(pdev, cap + PCI_EXP_LNKCTL, ctl);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3566
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3567
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3568
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3569
#define R8168_CPCMD_QUIRK_MASK (\
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3570
	EnableBist | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3571
	Mac_dbgo_oe | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3572
	Force_half_dup | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3573
	Force_rxflow_en | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3574
	Force_txflow_en | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3575
	Cxpl_dbg_sel | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3576
	ASF | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3577
	PktCntrDisable | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3578
	Mac_dbgo_sel)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3579
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3580
static void rtl_hw_start_8168bb(void __iomem *ioaddr, struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3581
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3582
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3583
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3584
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3585
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3586
	rtl_tx_performance_tweak(pdev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3587
		(0x5 << MAX_READ_REQUEST_SHIFT) | PCI_EXP_DEVCTL_NOSNOOP_EN);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3588
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3589
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3590
static void rtl_hw_start_8168bef(void __iomem *ioaddr, struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3591
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3592
	rtl_hw_start_8168bb(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3593
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3594
	RTL_W8(EarlyTxThres, EarlyTxThld);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3595
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3596
	RTL_W8(Config4, RTL_R8(Config4) & ~(1 << 0));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3597
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3598
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3599
static void __rtl_hw_start_8168cp(void __iomem *ioaddr, struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3600
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3601
	RTL_W8(Config1, RTL_R8(Config1) | Speed_down);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3602
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3603
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3604
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3605
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3606
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3607
	rtl_disable_clock_request(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3608
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3609
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3610
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3611
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3612
static void rtl_hw_start_8168cp_1(void __iomem *ioaddr, struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3613
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3614
	static const struct ephy_info e_info_8168cp[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3615
		{ 0x01, 0,	0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3616
		{ 0x02, 0x0800,	0x1000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3617
		{ 0x03, 0,	0x0042 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3618
		{ 0x06, 0x0080,	0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3619
		{ 0x07, 0,	0x2000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3620
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3621
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3622
	rtl_csi_access_enable(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3623
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3624
	rtl_ephy_init(ioaddr, e_info_8168cp, ARRAY_SIZE(e_info_8168cp));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3625
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3626
	__rtl_hw_start_8168cp(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3627
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3628
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3629
static void rtl_hw_start_8168cp_2(void __iomem *ioaddr, struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3630
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3631
	rtl_csi_access_enable(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3632
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3633
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3634
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3635
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3636
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3637
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3638
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3639
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3640
static void rtl_hw_start_8168cp_3(void __iomem *ioaddr, struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3641
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3642
	rtl_csi_access_enable(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3643
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3644
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3645
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3646
	/* Magic. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3647
	RTL_W8(DBG_REG, 0x20);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3648
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3649
	RTL_W8(EarlyTxThres, EarlyTxThld);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3650
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3651
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3652
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3653
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3654
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3655
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3656
static void rtl_hw_start_8168c_1(void __iomem *ioaddr, struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3657
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3658
	static const struct ephy_info e_info_8168c_1[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3659
		{ 0x02, 0x0800,	0x1000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3660
		{ 0x03, 0,	0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3661
		{ 0x06, 0x0080,	0x0000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3662
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3663
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3664
	rtl_csi_access_enable(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3665
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3666
	RTL_W8(DBG_REG, 0x06 | FIX_NAK_1 | FIX_NAK_2);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3667
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3668
	rtl_ephy_init(ioaddr, e_info_8168c_1, ARRAY_SIZE(e_info_8168c_1));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3669
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3670
	__rtl_hw_start_8168cp(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3671
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3672
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3673
static void rtl_hw_start_8168c_2(void __iomem *ioaddr, struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3674
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3675
	static const struct ephy_info e_info_8168c_2[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3676
		{ 0x01, 0,	0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3677
		{ 0x03, 0x0400,	0x0220 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3678
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3679
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3680
	rtl_csi_access_enable(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3681
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3682
	rtl_ephy_init(ioaddr, e_info_8168c_2, ARRAY_SIZE(e_info_8168c_2));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3683
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3684
	__rtl_hw_start_8168cp(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3685
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3686
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3687
static void rtl_hw_start_8168c_3(void __iomem *ioaddr, struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3688
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3689
	rtl_hw_start_8168c_2(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3690
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3691
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3692
static void rtl_hw_start_8168c_4(void __iomem *ioaddr, struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3693
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3694
	rtl_csi_access_enable(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3695
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3696
	__rtl_hw_start_8168cp(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3697
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3698
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3699
static void rtl_hw_start_8168d(void __iomem *ioaddr, struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3700
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3701
	rtl_csi_access_enable(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3702
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3703
	rtl_disable_clock_request(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3704
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3705
	RTL_W8(EarlyTxThres, EarlyTxThld);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3706
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3707
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3708
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3709
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3710
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3711
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3712
static void rtl_hw_start_8168(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3713
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3714
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3715
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3716
	struct pci_dev *pdev = tp->pci_dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3717
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3718
	RTL_W8(Cfg9346, Cfg9346_Unlock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3719
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3720
	RTL_W8(EarlyTxThres, EarlyTxThld);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3721
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3722
	rtl_set_rx_max_size(ioaddr, rx_buf_sz);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3723
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3724
	tp->cp_cmd |= RTL_R16(CPlusCmd) | PktCntrDisable | INTT_1;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3725
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3726
	RTL_W16(CPlusCmd, tp->cp_cmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3727
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3728
	RTL_W16(IntrMitigate, 0x5151);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3729
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3730
	/* Work around for RxFIFO overflow. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3731
	if (tp->mac_version == RTL_GIGA_MAC_VER_11 ||
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3732
	    tp->mac_version == RTL_GIGA_MAC_VER_22) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3733
		tp->intr_event |= RxFIFOOver | PCSTimeout;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3734
		tp->intr_event &= ~RxOverflow;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3735
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3736
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3737
	rtl_set_rx_tx_desc_registers(tp, ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3738
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3739
	rtl_set_rx_mode(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3740
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3741
	RTL_W32(TxConfig, (TX_DMA_BURST << TxDMAShift) |
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3742
		(InterFrameGap << TxInterFrameGapShift));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3743
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3744
	RTL_R8(IntrMask);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3745
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3746
	switch (tp->mac_version) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3747
	case RTL_GIGA_MAC_VER_11:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3748
		rtl_hw_start_8168bb(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3749
	break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3750
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3751
	case RTL_GIGA_MAC_VER_12:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3752
	case RTL_GIGA_MAC_VER_17:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3753
		rtl_hw_start_8168bef(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3754
	break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3755
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3756
	case RTL_GIGA_MAC_VER_18:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3757
		rtl_hw_start_8168cp_1(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3758
	break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3759
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3760
	case RTL_GIGA_MAC_VER_19:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3761
		rtl_hw_start_8168c_1(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3762
	break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3763
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3764
	case RTL_GIGA_MAC_VER_20:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3765
		rtl_hw_start_8168c_2(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3766
	break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3767
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3768
	case RTL_GIGA_MAC_VER_21:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3769
		rtl_hw_start_8168c_3(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3770
	break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3771
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3772
	case RTL_GIGA_MAC_VER_22:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3773
		rtl_hw_start_8168c_4(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3774
	break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3775
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3776
	case RTL_GIGA_MAC_VER_23:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3777
		rtl_hw_start_8168cp_2(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3778
	break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3779
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3780
	case RTL_GIGA_MAC_VER_24:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3781
		rtl_hw_start_8168cp_3(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3782
	break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3783
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3784
	case RTL_GIGA_MAC_VER_25:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3785
	case RTL_GIGA_MAC_VER_26:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3786
	case RTL_GIGA_MAC_VER_27:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3787
		rtl_hw_start_8168d(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3788
	break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3789
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3790
	default:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3791
		printk(KERN_ERR PFX "%s: unknown chipset (mac_version = %d).\n",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3792
			dev->name, tp->mac_version);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3793
	break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3794
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3795
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3796
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3797
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3798
	RTL_W8(Cfg9346, Cfg9346_Lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3799
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3800
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xF000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3801
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3802
	RTL_W16(IntrMask, tp->intr_event);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3803
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3804
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3805
#define R810X_CPCMD_QUIRK_MASK (\
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3806
	EnableBist | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3807
	Mac_dbgo_oe | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3808
	Force_half_dup | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3809
	Force_rxflow_en | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3810
	Force_txflow_en | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3811
	Cxpl_dbg_sel | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3812
	ASF | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3813
	PktCntrDisable | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3814
	PCIDAC | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3815
	PCIMulRW)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3816
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3817
static void rtl_hw_start_8102e_1(void __iomem *ioaddr, struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3818
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3819
	static const struct ephy_info e_info_8102e_1[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3820
		{ 0x01,	0, 0x6e65 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3821
		{ 0x02,	0, 0x091f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3822
		{ 0x03,	0, 0xc2f9 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3823
		{ 0x06,	0, 0xafb5 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3824
		{ 0x07,	0, 0x0e00 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3825
		{ 0x19,	0, 0xec80 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3826
		{ 0x01,	0, 0x2e65 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3827
		{ 0x01,	0, 0x6e65 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3828
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3829
	u8 cfg1;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3830
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3831
	rtl_csi_access_enable(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3832
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3833
	RTL_W8(DBG_REG, FIX_NAK_1);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3834
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3835
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3836
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3837
	RTL_W8(Config1,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3838
	       LEDS1 | LEDS0 | Speed_down | MEMMAP | IOMAP | VPD | PMEnable);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3839
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3840
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3841
	cfg1 = RTL_R8(Config1);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3842
	if ((cfg1 & LEDS0) && (cfg1 & LEDS1))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3843
		RTL_W8(Config1, cfg1 & ~LEDS0);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3844
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3845
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R810X_CPCMD_QUIRK_MASK);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3846
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3847
	rtl_ephy_init(ioaddr, e_info_8102e_1, ARRAY_SIZE(e_info_8102e_1));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3848
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3849
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3850
static void rtl_hw_start_8102e_2(void __iomem *ioaddr, struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3851
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3852
	rtl_csi_access_enable(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3853
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3854
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3855
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3856
	RTL_W8(Config1, MEMMAP | IOMAP | VPD | PMEnable);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3857
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3858
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3859
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R810X_CPCMD_QUIRK_MASK);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3860
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3861
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3862
static void rtl_hw_start_8102e_3(void __iomem *ioaddr, struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3863
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3864
	rtl_hw_start_8102e_2(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3865
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3866
	rtl_ephy_write(ioaddr, 0x03, 0xc2f9);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3867
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3868
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3869
static void rtl_hw_start_8101(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3870
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3871
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3872
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3873
	struct pci_dev *pdev = tp->pci_dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3874
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3875
	if ((tp->mac_version == RTL_GIGA_MAC_VER_13) ||
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3876
	    (tp->mac_version == RTL_GIGA_MAC_VER_16)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3877
		int cap = tp->pcie_cap;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3878
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3879
		if (cap) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3880
			pci_write_config_word(pdev, cap + PCI_EXP_DEVCTL,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3881
					      PCI_EXP_DEVCTL_NOSNOOP_EN);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3882
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3883
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3884
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3885
	switch (tp->mac_version) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3886
	case RTL_GIGA_MAC_VER_07:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3887
		rtl_hw_start_8102e_1(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3888
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3889
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3890
	case RTL_GIGA_MAC_VER_08:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3891
		rtl_hw_start_8102e_3(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3892
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3893
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3894
	case RTL_GIGA_MAC_VER_09:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3895
		rtl_hw_start_8102e_2(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3896
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3897
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3898
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3899
	RTL_W8(Cfg9346, Cfg9346_Unlock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3900
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3901
	RTL_W8(EarlyTxThres, EarlyTxThld);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3902
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3903
	rtl_set_rx_max_size(ioaddr, rx_buf_sz);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3904
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3905
	tp->cp_cmd |= rtl_rw_cpluscmd(ioaddr) | PCIMulRW;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3906
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3907
	RTL_W16(CPlusCmd, tp->cp_cmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3908
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3909
	RTL_W16(IntrMitigate, 0x0000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3910
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3911
	rtl_set_rx_tx_desc_registers(tp, ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3912
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3913
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3914
	rtl_set_rx_tx_config_registers(tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3915
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3916
	RTL_W8(Cfg9346, Cfg9346_Lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3917
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3918
	RTL_R8(IntrMask);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3919
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3920
	rtl_set_rx_mode(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3921
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3922
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3923
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3924
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xf000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3925
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3926
	RTL_W16(IntrMask, tp->intr_event);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3927
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3928
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3929
static int rtl8169_change_mtu(struct net_device *dev, int new_mtu)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3930
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3931
	if (new_mtu < ETH_ZLEN || new_mtu > SafeMtu)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3932
		return -EINVAL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3933
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3934
	dev->mtu = new_mtu;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3935
	return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3936
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3937
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3938
static inline void rtl8169_make_unusable_by_asic(struct RxDesc *desc)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3939
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3940
	desc->addr = cpu_to_le64(0x0badbadbadbadbadull);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3941
	desc->opts1 &= ~cpu_to_le32(DescOwn | RsvdMask);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3942
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3943
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3944
static void rtl8169_free_rx_databuff(struct rtl8169_private *tp,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3945
				     void **data_buff, struct RxDesc *desc)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3946
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3947
	dma_unmap_single(&tp->pci_dev->dev, le64_to_cpu(desc->addr), rx_buf_sz,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3948
			 DMA_FROM_DEVICE);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3949
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3950
	kfree(*data_buff);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3951
	*data_buff = NULL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3952
	rtl8169_make_unusable_by_asic(desc);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3953
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3954
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3955
static inline void rtl8169_mark_to_asic(struct RxDesc *desc, u32 rx_buf_sz)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3956
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3957
	u32 eor = le32_to_cpu(desc->opts1) & RingEnd;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3958
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3959
	desc->opts1 = cpu_to_le32(DescOwn | eor | rx_buf_sz);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3960
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3961
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3962
static inline void rtl8169_map_to_asic(struct RxDesc *desc, dma_addr_t mapping,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3963
				       u32 rx_buf_sz)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3964
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3965
	desc->addr = cpu_to_le64(mapping);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3966
	wmb();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3967
	rtl8169_mark_to_asic(desc, rx_buf_sz);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3968
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3969
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3970
static inline void *rtl8169_align(void *data)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3971
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3972
	return (void *)ALIGN((long)data, 16);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3973
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3974
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3975
static struct sk_buff *rtl8169_alloc_rx_data(struct rtl8169_private *tp,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3976
					     struct RxDesc *desc)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3977
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3978
	void *data;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3979
	dma_addr_t mapping;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3980
	struct device *d = &tp->pci_dev->dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3981
	struct net_device *dev = tp->dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3982
	int node = dev->dev.parent ? dev_to_node(dev->dev.parent) : -1;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3983
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3984
	data = kmalloc_node(rx_buf_sz, GFP_KERNEL, node);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3985
	if (!data)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3986
		return NULL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3987
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3988
	if (rtl8169_align(data) != data) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3989
		kfree(data);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3990
		data = kmalloc_node(rx_buf_sz + 15, GFP_KERNEL, node);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3991
		if (!data)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3992
			return NULL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3993
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3994
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3995
	mapping = dma_map_single(d, rtl8169_align(data), rx_buf_sz,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3996
				 DMA_FROM_DEVICE);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3997
	if (unlikely(dma_mapping_error(d, mapping))) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3998
		if (net_ratelimit())
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3999
			netif_err(tp, drv, tp->dev, "Failed to map RX DMA!\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4000
		goto err_out;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4001
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4002
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4003
	rtl8169_map_to_asic(desc, mapping, rx_buf_sz);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4004
	return data;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4005
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4006
err_out:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4007
	kfree(data);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4008
	return NULL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4009
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4010
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4011
static void rtl8169_rx_clear(struct rtl8169_private *tp)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4012
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4013
	unsigned int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4014
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4015
	for (i = 0; i < NUM_RX_DESC; i++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4016
		if (tp->Rx_databuff[i]) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4017
			rtl8169_free_rx_databuff(tp, tp->Rx_databuff + i,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4018
					    tp->RxDescArray + i);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4019
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4020
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4021
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4022
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4023
static inline void rtl8169_mark_as_last_descriptor(struct RxDesc *desc)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4024
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4025
	desc->opts1 |= cpu_to_le32(RingEnd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4026
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4027
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4028
static int rtl8169_rx_fill(struct rtl8169_private *tp)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4029
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4030
	unsigned int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4031
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4032
	for (i = 0; i < NUM_RX_DESC; i++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4033
		void *data;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4034
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4035
		if (tp->Rx_databuff[i])
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4036
			continue;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4037
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4038
		data = rtl8169_alloc_rx_data(tp, tp->RxDescArray + i);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4039
		if (!data) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4040
			rtl8169_make_unusable_by_asic(tp->RxDescArray + i);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4041
			goto err_out;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4042
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4043
		tp->Rx_databuff[i] = data;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4044
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4045
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4046
	rtl8169_mark_as_last_descriptor(tp->RxDescArray + NUM_RX_DESC - 1);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4047
	return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4048
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4049
err_out:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4050
	rtl8169_rx_clear(tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4051
	return -ENOMEM;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4052
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4053
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4054
static void rtl8169_init_ring_indexes(struct rtl8169_private *tp)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4055
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4056
	tp->dirty_tx = tp->dirty_rx = tp->cur_tx = tp->cur_rx = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4057
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4058
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4059
static int rtl8169_init_ring(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4060
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4061
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4062
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4063
	rtl8169_init_ring_indexes(tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4064
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4065
	memset(tp->tx_skb, 0x0, NUM_TX_DESC * sizeof(struct ring_info));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4066
	memset(tp->Rx_databuff, 0x0, NUM_RX_DESC * sizeof(void *));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4067
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4068
	return rtl8169_rx_fill(tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4069
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4070
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4071
static void rtl8169_unmap_tx_skb(struct device *d, struct ring_info *tx_skb,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4072
				 struct TxDesc *desc)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4073
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4074
	unsigned int len = tx_skb->len;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4075
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4076
	dma_unmap_single(d, le64_to_cpu(desc->addr), len, DMA_TO_DEVICE);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4077
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4078
	desc->opts1 = 0x00;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4079
	desc->opts2 = 0x00;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4080
	desc->addr = 0x00;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4081
	tx_skb->len = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4082
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4083
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4084
static void rtl8169_tx_clear_range(struct rtl8169_private *tp, u32 start,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4085
				   unsigned int n)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4086
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4087
	unsigned int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4088
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4089
	for (i = 0; i < n; i++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4090
		unsigned int entry = (start + i) % NUM_TX_DESC;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4091
		struct ring_info *tx_skb = tp->tx_skb + entry;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4092
		unsigned int len = tx_skb->len;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4093
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4094
		if (len) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4095
			struct sk_buff *skb = tx_skb->skb;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4096
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4097
			rtl8169_unmap_tx_skb(&tp->pci_dev->dev, tx_skb,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4098
					     tp->TxDescArray + entry);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4099
			if (skb) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4100
				tp->dev->stats.tx_dropped++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4101
				dev_kfree_skb(skb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4102
				tx_skb->skb = NULL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4103
			}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4104
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4105
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4106
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4107
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4108
static void rtl8169_tx_clear(struct rtl8169_private *tp)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4109
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4110
	rtl8169_tx_clear_range(tp, tp->dirty_tx, NUM_TX_DESC);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4111
	tp->cur_tx = tp->dirty_tx = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4112
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4113
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4114
static void rtl8169_schedule_work(struct net_device *dev, work_func_t task)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4115
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4116
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4117
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4118
	PREPARE_DELAYED_WORK(&tp->task, task);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4119
	schedule_delayed_work(&tp->task, 4);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4120
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4121
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4122
static void rtl8169_wait_for_quiescence(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4123
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4124
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4125
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4126
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4127
	synchronize_irq(dev->irq);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4128
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4129
	/* Wait for any pending NAPI task to complete */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4130
	napi_disable(&tp->napi);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4131
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4132
	rtl8169_irq_mask_and_ack(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4133
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4134
	tp->intr_mask = 0xffff;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4135
	RTL_W16(IntrMask, tp->intr_event);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4136
	napi_enable(&tp->napi);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4137
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4138
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4139
static void rtl8169_reinit_task(struct work_struct *work)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4140
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4141
	struct rtl8169_private *tp =
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4142
		container_of(work, struct rtl8169_private, task.work);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4143
	struct net_device *dev = tp->dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4144
	int ret;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4145
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4146
	rtnl_lock();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4147
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4148
	if (!netif_running(dev))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4149
		goto out_unlock;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4150
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4151
	rtl8169_wait_for_quiescence(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4152
	rtl8169_close(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4153
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4154
	ret = rtl8169_open(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4155
	if (unlikely(ret < 0)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4156
		if (net_ratelimit())
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4157
			netif_err(tp, drv, dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4158
				  "reinit failure (status = %d). Rescheduling\n",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4159
				  ret);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4160
		rtl8169_schedule_work(dev, rtl8169_reinit_task);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4161
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4162
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4163
out_unlock:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4164
	rtnl_unlock();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4165
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4166
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4167
static void rtl8169_reset_task(struct work_struct *work)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4168
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4169
	struct rtl8169_private *tp =
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4170
		container_of(work, struct rtl8169_private, task.work);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4171
	struct net_device *dev = tp->dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4172
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4173
	rtnl_lock();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4174
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4175
	if (!netif_running(dev))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4176
		goto out_unlock;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4177
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4178
	rtl8169_wait_for_quiescence(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4179
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4180
	rtl8169_rx_interrupt(dev, tp, tp->mmio_addr, ~(u32)0);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4181
	rtl8169_tx_clear(tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4182
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4183
	if (tp->dirty_rx == tp->cur_rx) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4184
		rtl8169_init_ring_indexes(tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4185
		rtl_hw_start(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4186
		netif_wake_queue(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4187
		rtl8169_check_link_status(dev, tp, tp->mmio_addr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4188
	} else {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4189
		if (net_ratelimit())
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4190
			netif_emerg(tp, intr, dev, "Rx buffers shortage\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4191
		rtl8169_schedule_work(dev, rtl8169_reset_task);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4192
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4193
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4194
out_unlock:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4195
	rtnl_unlock();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4196
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4197
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4198
static void rtl8169_tx_timeout(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4199
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4200
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4201
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4202
	rtl8169_hw_reset(tp->mmio_addr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4203
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4204
	/* Let's wait a bit while any (async) irq lands on */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4205
	rtl8169_schedule_work(dev, rtl8169_reset_task);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4206
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4207
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4208
static int rtl8169_xmit_frags(struct rtl8169_private *tp, struct sk_buff *skb,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4209
			      u32 opts1)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4210
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4211
	struct skb_shared_info *info = skb_shinfo(skb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4212
	unsigned int cur_frag, entry;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4213
	struct TxDesc * uninitialized_var(txd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4214
	struct device *d = &tp->pci_dev->dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4215
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4216
	entry = tp->cur_tx;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4217
	for (cur_frag = 0; cur_frag < info->nr_frags; cur_frag++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4218
		skb_frag_t *frag = info->frags + cur_frag;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4219
		dma_addr_t mapping;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4220
		u32 status, len;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4221
		void *addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4222
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4223
		entry = (entry + 1) % NUM_TX_DESC;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4224
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4225
		txd = tp->TxDescArray + entry;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4226
		len = frag->size;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4227
		addr = ((void *) page_address(frag->page)) + frag->page_offset;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4228
		mapping = dma_map_single(d, addr, len, DMA_TO_DEVICE);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4229
		if (unlikely(dma_mapping_error(d, mapping))) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4230
			if (net_ratelimit())
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4231
				netif_err(tp, drv, tp->dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4232
					  "Failed to map TX fragments DMA!\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4233
			goto err_out;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4234
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4235
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4236
		/* anti gcc 2.95.3 bugware (sic) */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4237
		status = opts1 | len | (RingEnd * !((entry + 1) % NUM_TX_DESC));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4238
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4239
		txd->opts1 = cpu_to_le32(status);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4240
		txd->addr = cpu_to_le64(mapping);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4241
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4242
		tp->tx_skb[entry].len = len;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4243
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4244
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4245
	if (cur_frag) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4246
		tp->tx_skb[entry].skb = skb;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4247
		txd->opts1 |= cpu_to_le32(LastFrag);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4248
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4249
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4250
	return cur_frag;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4251
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4252
err_out:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4253
	rtl8169_tx_clear_range(tp, tp->cur_tx + 1, cur_frag);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4254
	return -EIO;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4255
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4256
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4257
static inline u32 rtl8169_tso_csum(struct sk_buff *skb, struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4258
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4259
	if (dev->features & NETIF_F_TSO) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4260
		u32 mss = skb_shinfo(skb)->gso_size;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4261
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4262
		if (mss)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4263
			return LargeSend | ((mss & MSSMask) << MSSShift);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4264
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4265
	if (skb->ip_summed == CHECKSUM_PARTIAL) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4266
		const struct iphdr *ip = ip_hdr(skb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4267
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4268
		if (ip->protocol == IPPROTO_TCP)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4269
			return IPCS | TCPCS;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4270
		else if (ip->protocol == IPPROTO_UDP)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4271
			return IPCS | UDPCS;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4272
		WARN_ON(1);	/* we need a WARN() */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4273
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4274
	return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4275
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4276
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4277
static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4278
				      struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4279
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4280
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4281
	unsigned int entry = tp->cur_tx % NUM_TX_DESC;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4282
	struct TxDesc *txd = tp->TxDescArray + entry;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4283
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4284
	struct device *d = &tp->pci_dev->dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4285
	dma_addr_t mapping;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4286
	u32 status, len;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4287
	u32 opts1;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4288
	int frags;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4289
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4290
	if (unlikely(TX_BUFFS_AVAIL(tp) < skb_shinfo(skb)->nr_frags)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4291
		netif_err(tp, drv, dev, "BUG! Tx Ring full when queue awake!\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4292
		goto err_stop_0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4293
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4294
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4295
	if (unlikely(le32_to_cpu(txd->opts1) & DescOwn))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4296
		goto err_stop_0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4297
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4298
	len = skb_headlen(skb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4299
	mapping = dma_map_single(d, skb->data, len, DMA_TO_DEVICE);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4300
	if (unlikely(dma_mapping_error(d, mapping))) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4301
		if (net_ratelimit())
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4302
			netif_err(tp, drv, dev, "Failed to map TX DMA!\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4303
		goto err_dma_0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4304
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4305
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4306
	tp->tx_skb[entry].len = len;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4307
	txd->addr = cpu_to_le64(mapping);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4308
	txd->opts2 = cpu_to_le32(rtl8169_tx_vlan_tag(tp, skb));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4309
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4310
	opts1 = DescOwn | rtl8169_tso_csum(skb, dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4311
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4312
	frags = rtl8169_xmit_frags(tp, skb, opts1);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4313
	if (frags < 0)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4314
		goto err_dma_1;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4315
	else if (frags)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4316
		opts1 |= FirstFrag;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4317
	else {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4318
		opts1 |= FirstFrag | LastFrag;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4319
		tp->tx_skb[entry].skb = skb;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4320
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4321
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4322
	wmb();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4323
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4324
	/* anti gcc 2.95.3 bugware (sic) */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4325
	status = opts1 | len | (RingEnd * !((entry + 1) % NUM_TX_DESC));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4326
	txd->opts1 = cpu_to_le32(status);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4327
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4328
	tp->cur_tx += frags + 1;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4329
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4330
	wmb();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4331
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4332
	RTL_W8(TxPoll, NPQ);	/* set polling bit */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4333
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4334
	if (TX_BUFFS_AVAIL(tp) < MAX_SKB_FRAGS) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4335
		netif_stop_queue(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4336
		smp_rmb();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4337
		if (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4338
			netif_wake_queue(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4339
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4340
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4341
	return NETDEV_TX_OK;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4342
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4343
err_dma_1:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4344
	rtl8169_unmap_tx_skb(d, tp->tx_skb + entry, txd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4345
err_dma_0:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4346
	dev_kfree_skb(skb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4347
	dev->stats.tx_dropped++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4348
	return NETDEV_TX_OK;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4349
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4350
err_stop_0:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4351
	netif_stop_queue(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4352
	dev->stats.tx_dropped++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4353
	return NETDEV_TX_BUSY;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4354
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4355
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4356
static void rtl8169_pcierr_interrupt(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4357
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4358
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4359
	struct pci_dev *pdev = tp->pci_dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4360
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4361
	u16 pci_status, pci_cmd;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4362
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4363
	pci_read_config_word(pdev, PCI_COMMAND, &pci_cmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4364
	pci_read_config_word(pdev, PCI_STATUS, &pci_status);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4365
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4366
	netif_err(tp, intr, dev, "PCI error (cmd = 0x%04x, status = 0x%04x)\n",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4367
		  pci_cmd, pci_status);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4368
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4369
	/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4370
	 * The recovery sequence below admits a very elaborated explanation:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4371
	 * - it seems to work;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4372
	 * - I did not see what else could be done;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4373
	 * - it makes iop3xx happy.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4374
	 *
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4375
	 * Feel free to adjust to your needs.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4376
	 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4377
	if (pdev->broken_parity_status)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4378
		pci_cmd &= ~PCI_COMMAND_PARITY;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4379
	else
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4380
		pci_cmd |= PCI_COMMAND_SERR | PCI_COMMAND_PARITY;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4381
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4382
	pci_write_config_word(pdev, PCI_COMMAND, pci_cmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4383
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4384
	pci_write_config_word(pdev, PCI_STATUS,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4385
		pci_status & (PCI_STATUS_DETECTED_PARITY |
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4386
		PCI_STATUS_SIG_SYSTEM_ERROR | PCI_STATUS_REC_MASTER_ABORT |
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4387
		PCI_STATUS_REC_TARGET_ABORT | PCI_STATUS_SIG_TARGET_ABORT));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4388
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4389
	/* The infamous DAC f*ckup only happens at boot time */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4390
	if ((tp->cp_cmd & PCIDAC) && !tp->dirty_rx && !tp->cur_rx) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4391
		netif_info(tp, intr, dev, "disabling PCI DAC\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4392
		tp->cp_cmd &= ~PCIDAC;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4393
		RTL_W16(CPlusCmd, tp->cp_cmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4394
		dev->features &= ~NETIF_F_HIGHDMA;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4395
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4396
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4397
	rtl8169_hw_reset(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4398
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4399
	rtl8169_schedule_work(dev, rtl8169_reinit_task);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4400
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4401
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4402
static void rtl8169_tx_interrupt(struct net_device *dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4403
				 struct rtl8169_private *tp,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4404
				 void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4405
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4406
	unsigned int dirty_tx, tx_left;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4407
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4408
	dirty_tx = tp->dirty_tx;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4409
	smp_rmb();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4410
	tx_left = tp->cur_tx - dirty_tx;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4411
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4412
	while (tx_left > 0) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4413
		unsigned int entry = dirty_tx % NUM_TX_DESC;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4414
		struct ring_info *tx_skb = tp->tx_skb + entry;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4415
		u32 status;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4416
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4417
		rmb();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4418
		status = le32_to_cpu(tp->TxDescArray[entry].opts1);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4419
		if (status & DescOwn)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4420
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4421
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4422
		rtl8169_unmap_tx_skb(&tp->pci_dev->dev, tx_skb,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4423
				     tp->TxDescArray + entry);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4424
		if (status & LastFrag) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4425
			dev->stats.tx_packets++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4426
			dev->stats.tx_bytes += tx_skb->skb->len;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4427
			dev_kfree_skb(tx_skb->skb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4428
			tx_skb->skb = NULL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4429
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4430
		dirty_tx++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4431
		tx_left--;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4432
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4433
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4434
	if (tp->dirty_tx != dirty_tx) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4435
		tp->dirty_tx = dirty_tx;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4436
		smp_wmb();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4437
		if (netif_queue_stopped(dev) &&
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4438
		    (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4439
			netif_wake_queue(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4440
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4441
		/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4442
		 * 8168 hack: TxPoll requests are lost when the Tx packets are
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4443
		 * too close. Let's kick an extra TxPoll request when a burst
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4444
		 * of start_xmit activity is detected (if it is not detected,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4445
		 * it is slow enough). -- FR
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4446
		 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4447
		smp_rmb();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4448
		if (tp->cur_tx != dirty_tx)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4449
			RTL_W8(TxPoll, NPQ);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4450
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4451
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4452
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4453
static inline int rtl8169_fragmented_frame(u32 status)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4454
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4455
	return (status & (FirstFrag | LastFrag)) != (FirstFrag | LastFrag);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4456
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4457
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4458
static inline void rtl8169_rx_csum(struct sk_buff *skb, u32 opts1)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4459
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4460
	u32 status = opts1 & RxProtoMask;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4461
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4462
	if (((status == RxProtoTCP) && !(opts1 & TCPFail)) ||
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4463
	    ((status == RxProtoUDP) && !(opts1 & UDPFail)))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4464
		skb->ip_summed = CHECKSUM_UNNECESSARY;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4465
	else
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4466
		skb_checksum_none_assert(skb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4467
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4468
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4469
static struct sk_buff *rtl8169_try_rx_copy(void *data,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4470
					   struct rtl8169_private *tp,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4471
					   int pkt_size,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4472
					   dma_addr_t addr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4473
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4474
	struct sk_buff *skb;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4475
	struct device *d = &tp->pci_dev->dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4476
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4477
	data = rtl8169_align(data);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4478
	dma_sync_single_for_cpu(d, addr, pkt_size, DMA_FROM_DEVICE);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4479
	prefetch(data);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4480
	skb = netdev_alloc_skb_ip_align(tp->dev, pkt_size);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4481
	if (skb)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4482
		memcpy(skb->data, data, pkt_size);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4483
	dma_sync_single_for_device(d, addr, pkt_size, DMA_FROM_DEVICE);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4484
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4485
	return skb;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4486
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4487
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4488
/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4489
 * Warning : rtl8169_rx_interrupt() might be called :
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4490
 * 1) from NAPI (softirq) context
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4491
 *	(polling = 1 : we should call netif_receive_skb())
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4492
 * 2) from process context (rtl8169_reset_task())
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4493
 *	(polling = 0 : we must call netif_rx() instead)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4494
 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4495
static int rtl8169_rx_interrupt(struct net_device *dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4496
				struct rtl8169_private *tp,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4497
				void __iomem *ioaddr, u32 budget)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4498
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4499
	unsigned int cur_rx, rx_left;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4500
	unsigned int count;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4501
	int polling = (budget != ~(u32)0) ? 1 : 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4502
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4503
	cur_rx = tp->cur_rx;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4504
	rx_left = NUM_RX_DESC + tp->dirty_rx - cur_rx;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4505
	rx_left = min(rx_left, budget);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4506
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4507
	for (; rx_left > 0; rx_left--, cur_rx++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4508
		unsigned int entry = cur_rx % NUM_RX_DESC;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4509
		struct RxDesc *desc = tp->RxDescArray + entry;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4510
		u32 status;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4511
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4512
		rmb();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4513
		status = le32_to_cpu(desc->opts1);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4514
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4515
		if (status & DescOwn)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4516
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4517
		if (unlikely(status & RxRES)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4518
			netif_info(tp, rx_err, dev, "Rx ERROR. status = %08x\n",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4519
				   status);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4520
			dev->stats.rx_errors++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4521
			if (status & (RxRWT | RxRUNT))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4522
				dev->stats.rx_length_errors++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4523
			if (status & RxCRC)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4524
				dev->stats.rx_crc_errors++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4525
			if (status & RxFOVF) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4526
				rtl8169_schedule_work(dev, rtl8169_reset_task);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4527
				dev->stats.rx_fifo_errors++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4528
			}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4529
			rtl8169_mark_to_asic(desc, rx_buf_sz);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4530
		} else {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4531
			struct sk_buff *skb;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4532
			dma_addr_t addr = le64_to_cpu(desc->addr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4533
			int pkt_size = (status & 0x00001FFF) - 4;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4534
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4535
			/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4536
			 * The driver does not support incoming fragmented
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4537
			 * frames. They are seen as a symptom of over-mtu
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4538
			 * sized frames.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4539
			 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4540
			if (unlikely(rtl8169_fragmented_frame(status))) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4541
				dev->stats.rx_dropped++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4542
				dev->stats.rx_length_errors++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4543
				rtl8169_mark_to_asic(desc, rx_buf_sz);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4544
				continue;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4545
			}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4546
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4547
			skb = rtl8169_try_rx_copy(tp->Rx_databuff[entry],
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4548
						  tp, pkt_size, addr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4549
			rtl8169_mark_to_asic(desc, rx_buf_sz);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4550
			if (!skb) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4551
				dev->stats.rx_dropped++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4552
				continue;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4553
			}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4554
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4555
			rtl8169_rx_csum(skb, status);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4556
			skb_put(skb, pkt_size);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4557
			skb->protocol = eth_type_trans(skb, dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4558
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4559
			if (rtl8169_rx_vlan_skb(tp, desc, skb, polling) < 0) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4560
				if (likely(polling))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4561
					napi_gro_receive(&tp->napi, skb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4562
				else
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4563
					netif_rx(skb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4564
			}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4565
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4566
			dev->stats.rx_bytes += pkt_size;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4567
			dev->stats.rx_packets++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4568
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4569
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4570
		/* Work around for AMD plateform. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4571
		if ((desc->opts2 & cpu_to_le32(0xfffe000)) &&
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4572
		    (tp->mac_version == RTL_GIGA_MAC_VER_05)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4573
			desc->opts2 = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4574
			cur_rx++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4575
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4576
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4577
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4578
	count = cur_rx - tp->cur_rx;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4579
	tp->cur_rx = cur_rx;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4580
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4581
	tp->dirty_rx += count;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4582
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4583
	return count;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4584
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4585
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4586
static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4587
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4588
	struct net_device *dev = dev_instance;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4589
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4590
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4591
	int handled = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4592
	int status;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4593
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4594
	/* loop handling interrupts until we have no new ones or
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4595
	 * we hit a invalid/hotplug case.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4596
	 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4597
	status = RTL_R16(IntrStatus);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4598
	while (status && status != 0xffff) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4599
		handled = 1;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4600
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4601
		/* Handle all of the error cases first. These will reset
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4602
		 * the chip, so just exit the loop.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4603
		 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4604
		if (unlikely(!netif_running(dev))) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4605
			rtl8169_asic_down(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4606
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4607
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4608
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4609
		if (unlikely(status & RxFIFOOver)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4610
			switch (tp->mac_version) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4611
			/* Work around for rx fifo overflow */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4612
			case RTL_GIGA_MAC_VER_11:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4613
			case RTL_GIGA_MAC_VER_22:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4614
			case RTL_GIGA_MAC_VER_26:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4615
				netif_stop_queue(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4616
				rtl8169_tx_timeout(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4617
				goto done;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4618
			/* Testers needed. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4619
			case RTL_GIGA_MAC_VER_17:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4620
			case RTL_GIGA_MAC_VER_19:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4621
			case RTL_GIGA_MAC_VER_20:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4622
			case RTL_GIGA_MAC_VER_21:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4623
			case RTL_GIGA_MAC_VER_23:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4624
			case RTL_GIGA_MAC_VER_24:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4625
			case RTL_GIGA_MAC_VER_27:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4626
			/* Experimental science. Pktgen proof. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4627
			case RTL_GIGA_MAC_VER_12:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4628
			case RTL_GIGA_MAC_VER_25:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4629
				if (status == RxFIFOOver)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4630
					goto done;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4631
				break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4632
			default:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4633
				break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4634
			}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4635
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4636
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4637
		if (unlikely(status & SYSErr)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4638
			rtl8169_pcierr_interrupt(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4639
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4640
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4641
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4642
		if (status & LinkChg)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4643
			__rtl8169_check_link_status(dev, tp, ioaddr, true);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4644
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4645
		/* We need to see the lastest version of tp->intr_mask to
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4646
		 * avoid ignoring an MSI interrupt and having to wait for
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4647
		 * another event which may never come.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4648
		 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4649
		smp_rmb();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4650
		if (status & tp->intr_mask & tp->napi_event) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4651
			RTL_W16(IntrMask, tp->intr_event & ~tp->napi_event);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4652
			tp->intr_mask = ~tp->napi_event;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4653
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4654
			if (likely(napi_schedule_prep(&tp->napi)))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4655
				__napi_schedule(&tp->napi);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4656
			else
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4657
				netif_info(tp, intr, dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4658
					   "interrupt %04x in poll\n", status);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4659
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4660
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4661
		/* We only get a new MSI interrupt when all active irq
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4662
		 * sources on the chip have been acknowledged. So, ack
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4663
		 * everything we've seen and check if new sources have become
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4664
		 * active to avoid blocking all interrupts from the chip.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4665
		 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4666
		RTL_W16(IntrStatus,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4667
			(status & RxFIFOOver) ? (status | RxOverflow) : status);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4668
		status = RTL_R16(IntrStatus);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4669
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4670
done:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4671
	return IRQ_RETVAL(handled);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4672
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4673
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4674
static int rtl8169_poll(struct napi_struct *napi, int budget)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4675
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4676
	struct rtl8169_private *tp = container_of(napi, struct rtl8169_private, napi);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4677
	struct net_device *dev = tp->dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4678
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4679
	int work_done;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4680
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4681
	work_done = rtl8169_rx_interrupt(dev, tp, ioaddr, (u32) budget);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4682
	rtl8169_tx_interrupt(dev, tp, ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4683
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4684
	if (work_done < budget) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4685
		napi_complete(napi);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4686
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4687
		/* We need for force the visibility of tp->intr_mask
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4688
		 * for other CPUs, as we can loose an MSI interrupt
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4689
		 * and potentially wait for a retransmit timeout if we don't.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4690
		 * The posted write to IntrMask is safe, as it will
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4691
		 * eventually make it to the chip and we won't loose anything
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4692
		 * until it does.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4693
		 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4694
		tp->intr_mask = 0xffff;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4695
		wmb();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4696
		RTL_W16(IntrMask, tp->intr_event);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4697
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4698
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4699
	return work_done;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4700
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4701
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4702
static void rtl8169_rx_missed(struct net_device *dev, void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4703
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4704
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4705
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4706
	if (tp->mac_version > RTL_GIGA_MAC_VER_06)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4707
		return;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4708
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4709
	dev->stats.rx_missed_errors += (RTL_R32(RxMissed) & 0xffffff);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4710
	RTL_W32(RxMissed, 0);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4711
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4712
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4713
static void rtl8169_down(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4714
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4715
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4716
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4717
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4718
	rtl8169_delete_timer(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4719
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4720
	netif_stop_queue(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4721
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4722
	napi_disable(&tp->napi);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4723
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4724
	spin_lock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4725
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4726
	rtl8169_asic_down(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4727
	/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4728
	 * At this point device interrupts can not be enabled in any function,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4729
	 * as netif_running is not true (rtl8169_interrupt, rtl8169_reset_task,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4730
	 * rtl8169_reinit_task) and napi is disabled (rtl8169_poll).
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4731
	 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4732
	rtl8169_rx_missed(dev, ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4733
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4734
	spin_unlock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4735
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4736
	synchronize_irq(dev->irq);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4737
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4738
	/* Give a racing hard_start_xmit a few cycles to complete. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4739
	synchronize_sched();  /* FIXME: should this be synchronize_irq()? */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4740
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4741
	rtl8169_tx_clear(tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4742
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4743
	rtl8169_rx_clear(tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4744
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4745
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4746
static int rtl8169_close(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4747
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4748
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4749
	struct pci_dev *pdev = tp->pci_dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4750
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4751
	pm_runtime_get_sync(&pdev->dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4752
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4753
	/* update counters before going down */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4754
	rtl8169_update_counters(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4755
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4756
	rtl8169_down(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4757
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4758
	free_irq(dev->irq, dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4759
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4760
	dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4761
			  tp->RxPhyAddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4762
	dma_free_coherent(&pdev->dev, R8169_TX_RING_BYTES, tp->TxDescArray,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4763
			  tp->TxPhyAddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4764
	tp->TxDescArray = NULL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4765
	tp->RxDescArray = NULL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4766
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4767
	pm_runtime_put_sync(&pdev->dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4768
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4769
	return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4770
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4771
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4772
static void rtl_set_rx_mode(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4773
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4774
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4775
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4776
	unsigned long flags;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4777
	u32 mc_filter[2];	/* Multicast hash filter */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4778
	int rx_mode;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4779
	u32 tmp = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4780
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4781
	if (dev->flags & IFF_PROMISC) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4782
		/* Unconditionally log net taps. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4783
		netif_notice(tp, link, dev, "Promiscuous mode enabled\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4784
		rx_mode =
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4785
		    AcceptBroadcast | AcceptMulticast | AcceptMyPhys |
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4786
		    AcceptAllPhys;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4787
		mc_filter[1] = mc_filter[0] = 0xffffffff;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4788
	} else if ((netdev_mc_count(dev) > multicast_filter_limit) ||
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4789
		   (dev->flags & IFF_ALLMULTI)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4790
		/* Too many to filter perfectly -- accept all multicasts. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4791
		rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4792
		mc_filter[1] = mc_filter[0] = 0xffffffff;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4793
	} else {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4794
		struct netdev_hw_addr *ha;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4795
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4796
		rx_mode = AcceptBroadcast | AcceptMyPhys;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4797
		mc_filter[1] = mc_filter[0] = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4798
		netdev_for_each_mc_addr(ha, dev) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4799
			int bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4800
			mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4801
			rx_mode |= AcceptMulticast;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4802
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4803
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4804
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4805
	spin_lock_irqsave(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4806
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4807
	tmp = rtl8169_rx_config | rx_mode |
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4808
	      (RTL_R32(RxConfig) & rtl_chip_info[tp->chipset].RxConfigMask);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4809
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4810
	if (tp->mac_version > RTL_GIGA_MAC_VER_06) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4811
		u32 data = mc_filter[0];
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4812
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4813
		mc_filter[0] = swab32(mc_filter[1]);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4814
		mc_filter[1] = swab32(data);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4815
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4816
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4817
	RTL_W32(MAR0 + 4, mc_filter[1]);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4818
	RTL_W32(MAR0 + 0, mc_filter[0]);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4819
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4820
	RTL_W32(RxConfig, tmp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4821
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4822
	spin_unlock_irqrestore(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4823
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4824
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4825
/**
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4826
 *  rtl8169_get_stats - Get rtl8169 read/write statistics
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4827
 *  @dev: The Ethernet Device to get statistics for
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4828
 *
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4829
 *  Get TX/RX statistics for rtl8169
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4830
 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4831
static struct net_device_stats *rtl8169_get_stats(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4832
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4833
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4834
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4835
	unsigned long flags;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4836
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4837
	if (netif_running(dev)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4838
		spin_lock_irqsave(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4839
		rtl8169_rx_missed(dev, ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4840
		spin_unlock_irqrestore(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4841
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4842
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4843
	return &dev->stats;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4844
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4845
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4846
static void rtl8169_net_suspend(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4847
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4848
	if (!netif_running(dev))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4849
		return;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4850
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4851
	netif_device_detach(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4852
	netif_stop_queue(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4853
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4854
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4855
#ifdef CONFIG_PM
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4856
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4857
static int rtl8169_suspend(struct device *device)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4858
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4859
	struct pci_dev *pdev = to_pci_dev(device);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4860
	struct net_device *dev = pci_get_drvdata(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4861
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4862
	rtl8169_net_suspend(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4863
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4864
	return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4865
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4866
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4867
static void __rtl8169_resume(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4868
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4869
	netif_device_attach(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4870
	rtl8169_schedule_work(dev, rtl8169_reset_task);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4871
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4872
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4873
static int rtl8169_resume(struct device *device)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4874
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4875
	struct pci_dev *pdev = to_pci_dev(device);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4876
	struct net_device *dev = pci_get_drvdata(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4877
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4878
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4879
	rtl8169_init_phy(dev, tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4880
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4881
	if (netif_running(dev))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4882
		__rtl8169_resume(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4883
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4884
	return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4885
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4886
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4887
static int rtl8169_runtime_suspend(struct device *device)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4888
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4889
	struct pci_dev *pdev = to_pci_dev(device);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4890
	struct net_device *dev = pci_get_drvdata(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4891
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4892
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4893
	if (!tp->TxDescArray)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4894
		return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4895
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4896
	spin_lock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4897
	tp->saved_wolopts = __rtl8169_get_wol(tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4898
	__rtl8169_set_wol(tp, WAKE_ANY);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4899
	spin_unlock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4900
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4901
	rtl8169_net_suspend(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4902
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4903
	return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4904
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4905
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4906
static int rtl8169_runtime_resume(struct device *device)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4907
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4908
	struct pci_dev *pdev = to_pci_dev(device);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4909
	struct net_device *dev = pci_get_drvdata(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4910
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4911
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4912
	if (!tp->TxDescArray)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4913
		return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4914
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4915
	spin_lock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4916
	__rtl8169_set_wol(tp, tp->saved_wolopts);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4917
	tp->saved_wolopts = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4918
	spin_unlock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4919
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4920
	rtl8169_init_phy(dev, tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4921
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4922
	__rtl8169_resume(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4923
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4924
	return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4925
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4926
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4927
static int rtl8169_runtime_idle(struct device *device)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4928
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4929
	struct pci_dev *pdev = to_pci_dev(device);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4930
	struct net_device *dev = pci_get_drvdata(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4931
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4932
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4933
	return tp->TxDescArray ? -EBUSY : 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4934
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4935
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4936
static const struct dev_pm_ops rtl8169_pm_ops = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4937
	.suspend = rtl8169_suspend,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4938
	.resume = rtl8169_resume,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4939
	.freeze = rtl8169_suspend,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4940
	.thaw = rtl8169_resume,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4941
	.poweroff = rtl8169_suspend,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4942
	.restore = rtl8169_resume,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4943
	.runtime_suspend = rtl8169_runtime_suspend,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4944
	.runtime_resume = rtl8169_runtime_resume,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4945
	.runtime_idle = rtl8169_runtime_idle,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4946
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4947
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4948
#define RTL8169_PM_OPS	(&rtl8169_pm_ops)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4949
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4950
#else /* !CONFIG_PM */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4951
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4952
#define RTL8169_PM_OPS	NULL
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4953
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4954
#endif /* !CONFIG_PM */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4955
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4956
static void rtl_shutdown(struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4957
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4958
	struct net_device *dev = pci_get_drvdata(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4959
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4960
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4961
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4962
	rtl8169_net_suspend(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4963
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4964
	/* restore original MAC address */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4965
	rtl_rar_set(tp, dev->perm_addr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4966
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4967
	spin_lock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4968
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4969
	rtl8169_asic_down(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4970
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4971
	spin_unlock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4972
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4973
	if (system_state == SYSTEM_POWER_OFF) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4974
		/* WoL fails with some 8168 when the receiver is disabled. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4975
		if (tp->features & RTL_FEATURE_WOL) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4976
			pci_clear_master(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4977
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4978
			RTL_W8(ChipCmd, CmdRxEnb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4979
			/* PCI commit */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4980
			RTL_R8(ChipCmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4981
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4982
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4983
		pci_wake_from_d3(pdev, true);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4984
		pci_set_power_state(pdev, PCI_D3hot);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4985
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4986
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4987
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4988
static struct pci_driver rtl8169_pci_driver = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4989
	.name		= MODULENAME,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4990
	.id_table	= rtl8169_pci_tbl,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4991
	.probe		= rtl8169_init_one,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4992
	.remove		= __devexit_p(rtl8169_remove_one),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4993
	.shutdown	= rtl_shutdown,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4994
	.driver.pm	= RTL8169_PM_OPS,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4995
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4996
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4997
static int __init rtl8169_init_module(void)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4998
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4999
	return pci_register_driver(&rtl8169_pci_driver);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5000
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5001
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5002
static void __exit rtl8169_cleanup_module(void)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5003
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5004
	pci_unregister_driver(&rtl8169_pci_driver);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5005
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5006
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5007
module_init(rtl8169_init_module);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5008
module_exit(rtl8169_cleanup_module);