devices/r8169-2.6.37-orig.c
author Patrick Bruenn <p.bruenn@beckhoff.com>
Tue, 12 Apr 2016 11:17:36 +0200
branchstable-1.5
changeset 2654 b3f6b3e5ef29
parent 2224 4f6670f083f1
permissions -rw-r--r--
devices/ccat: revert "limit rx processing to one frame per poll"

revert "limit rx processing to one frame per poll", which caused etherlab
frame timeouts in setups with more than one frame per cycle.
2224
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/*
4f6670f083f1 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.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
 *
4f6670f083f1 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>
4f6670f083f1 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>
4f6670f083f1 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.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     7
 *
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     8
 * See MAINTAINERS file for support contact information.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     9
 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    10
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    11
#include <linux/module.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    12
#include <linux/moduleparam.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    13
#include <linux/pci.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    14
#include <linux/netdevice.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    15
#include <linux/etherdevice.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    16
#include <linux/delay.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    17
#include <linux/ethtool.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    18
#include <linux/mii.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    19
#include <linux/if_vlan.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
#include <linux/crc32.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
#include <linux/in.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    22
#include <linux/ip.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    23
#include <linux/tcp.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    24
#include <linux/init.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    25
#include <linux/dma-mapping.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    26
#include <linux/pm_runtime.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    27
#include <linux/pci-aspm.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
#include <asm/system.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
#include <asm/io.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
#include <asm/irq.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
#define RTL8169_VERSION "2.3LK-NAPI"
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
#define MODULENAME "r8169"
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
#define PFX MODULENAME ": "
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    37
#ifdef RTL8169_DEBUG
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    38
#define assert(expr) \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
	if (!(expr)) {					\
4f6670f083f1 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",	\
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
		#expr,__FILE__,__func__,__LINE__);		\
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
#define dprintk(fmt, args...) \
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
#else
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    46
#define assert(expr) do {} while (0)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    47
#define dprintk(fmt, args...)	do {} while (0)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    48
#endif /* RTL8169_DEBUG */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    49
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    50
#define R8169_MSG_DEFAULT \
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    53
#define TX_BUFFS_AVAIL(tp) \
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    55
4f6670f083f1 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).
4f6670f083f1 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. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    58
static const int multicast_filter_limit = 32;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
/* MAC address length */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
#define MAC_ADDR_LEN	6
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    63
#define MAX_READ_REQUEST_SHIFT	12
4f6670f083f1 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. */
4f6670f083f1 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 */
4f6670f083f1 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 */
4f6670f083f1 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 */
4f6670f083f1 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 */
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    71
#define R8169_REGS_SIZE		256
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
#define R8169_NAPI_WEIGHT	64
4f6670f083f1 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 */
4f6670f083f1 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 */
4f6670f083f1 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 */
4f6670f083f1 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))
4f6670f083f1 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))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
#define RTL8169_TX_TIMEOUT	(6*HZ)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    80
#define RTL8169_PHY_TIMEOUT	(10*HZ)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    81
4f6670f083f1 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)
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    84
#define RTL_EEPROM_SIG_ADDR	0x0000
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    85
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
/* write/read MMIO register */
4f6670f083f1 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))
4f6670f083f1 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))
4f6670f083f1 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))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    90
#define RTL_R8(reg)		readb (ioaddr + (reg))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    91
#define RTL_R16(reg)		readw (ioaddr + (reg))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
#define RTL_R32(reg)		readl (ioaddr + (reg))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    93
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    94
enum mac_version {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    95
	RTL_GIGA_MAC_NONE   = 0x00,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
	RTL_GIGA_MAC_VER_01 = 0x01, // 8169
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    97
	RTL_GIGA_MAC_VER_02 = 0x02, // 8169S
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    98
	RTL_GIGA_MAC_VER_03 = 0x03, // 8110S
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    99
	RTL_GIGA_MAC_VER_04 = 0x04, // 8169SB
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   100
	RTL_GIGA_MAC_VER_05 = 0x05, // 8110SCd
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   101
	RTL_GIGA_MAC_VER_06 = 0x06, // 8110SCe
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   102
	RTL_GIGA_MAC_VER_07 = 0x07, // 8102e
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   103
	RTL_GIGA_MAC_VER_08 = 0x08, // 8102e
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   104
	RTL_GIGA_MAC_VER_09 = 0x09, // 8102e
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   105
	RTL_GIGA_MAC_VER_10 = 0x0a, // 8101e
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   106
	RTL_GIGA_MAC_VER_11 = 0x0b, // 8168Bb
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   107
	RTL_GIGA_MAC_VER_12 = 0x0c, // 8168Be
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   108
	RTL_GIGA_MAC_VER_13 = 0x0d, // 8101Eb
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   109
	RTL_GIGA_MAC_VER_14 = 0x0e, // 8101 ?
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   110
	RTL_GIGA_MAC_VER_15 = 0x0f, // 8101 ?
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   111
	RTL_GIGA_MAC_VER_16 = 0x11, // 8101Ec
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   112
	RTL_GIGA_MAC_VER_17 = 0x10, // 8168Bf
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   113
	RTL_GIGA_MAC_VER_18 = 0x12, // 8168CP
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   114
	RTL_GIGA_MAC_VER_19 = 0x13, // 8168C
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   115
	RTL_GIGA_MAC_VER_20 = 0x14, // 8168C
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
	RTL_GIGA_MAC_VER_21 = 0x15, // 8168C
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
	RTL_GIGA_MAC_VER_22 = 0x16, // 8168C
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   118
	RTL_GIGA_MAC_VER_23 = 0x17, // 8168CP
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
	RTL_GIGA_MAC_VER_24 = 0x18, // 8168CP
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
	RTL_GIGA_MAC_VER_25 = 0x19, // 8168D
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   121
	RTL_GIGA_MAC_VER_26 = 0x1a, // 8168D
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
	RTL_GIGA_MAC_VER_27 = 0x1b  // 8168DP
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   123
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   124
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
#define _R(NAME,MAC,MASK) \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   126
	{ .name = NAME, .mac_version = MAC, .RxConfigMask = MASK }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   127
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   128
static const struct {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   129
	const char *name;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   130
	u8 mac_version;
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   132
} rtl_chip_info[] = {
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   160
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   161
#undef _R
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   162
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   163
enum cfg_version {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   164
	RTL_CFG_0 = 0x00,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   165
	RTL_CFG_1,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
	RTL_CFG_2
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   167
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
4f6670f083f1 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 *);
4f6670f083f1 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 *);
4f6670f083f1 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 *);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   172
4f6670f083f1 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) = {
4f6670f083f1 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 },
4f6670f083f1 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 },
4f6670f083f1 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 },
4f6670f083f1 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 },
4f6670f083f1 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 },
4f6670f083f1 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 },
4f6670f083f1 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 },
4f6670f083f1 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 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   182
	{ PCI_VENDOR_ID_LINKSYS,		0x1032,
4f6670f083f1 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 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   184
	{ 0x0001,				0x8168,
4f6670f083f1 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 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
	{0,},
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   187
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   188
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   189
MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   190
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   191
static int rx_buf_sz = 16383;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   192
static int use_dac;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
static struct {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   194
	u32 msg_enable;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   195
} debug = { -1 };
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
enum rtl_registers {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   198
	MAC0		= 0,	/* Ethernet hardware address. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
	MAC4		= 4,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   200
	MAR0		= 8,	/* Multicast filter. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   201
	CounterAddrLow		= 0x10,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   202
	CounterAddrHigh		= 0x14,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   203
	TxDescStartAddrLow	= 0x20,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   204
	TxDescStartAddrHigh	= 0x24,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   205
	TxHDescStartAddrLow	= 0x28,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   206
	TxHDescStartAddrHigh	= 0x2c,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   207
	FLASH		= 0x30,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   208
	ERSR		= 0x36,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   209
	ChipCmd		= 0x37,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   210
	TxPoll		= 0x38,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   211
	IntrMask	= 0x3c,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   212
	IntrStatus	= 0x3e,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   213
	TxConfig	= 0x40,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   214
	RxConfig	= 0x44,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   215
	RxMissed	= 0x4c,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   216
	Cfg9346		= 0x50,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   217
	Config0		= 0x51,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   218
	Config1		= 0x52,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   219
	Config2		= 0x53,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   220
	Config3		= 0x54,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   221
	Config4		= 0x55,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   222
	Config5		= 0x56,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   223
	MultiIntr	= 0x5c,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   224
	PHYAR		= 0x60,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   225
	PHYstatus	= 0x6c,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   226
	RxMaxSize	= 0xda,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   227
	CPlusCmd	= 0xe0,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   228
	IntrMitigate	= 0xe2,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   229
	RxDescAddrLow	= 0xe4,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   230
	RxDescAddrHigh	= 0xe8,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   231
	EarlyTxThres	= 0xec,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   232
	FuncEvent	= 0xf0,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   233
	FuncEventMask	= 0xf4,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   234
	FuncPresetState	= 0xf8,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   235
	FuncForceEvent	= 0xfc,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   236
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   237
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   238
enum rtl8110_registers {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   239
	TBICSR			= 0x64,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   240
	TBI_ANAR		= 0x68,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   241
	TBI_LPAR		= 0x6a,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   242
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   243
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   244
enum rtl8168_8101_registers {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   245
	CSIDR			= 0x64,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   246
	CSIAR			= 0x68,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   247
#define	CSIAR_FLAG			0x80000000
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   248
#define	CSIAR_WRITE_CMD			0x80000000
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
#define	CSIAR_BYTE_ENABLE		0x0f
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   250
#define	CSIAR_BYTE_ENABLE_SHIFT		12
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   251
#define	CSIAR_ADDR_MASK			0x0fff
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   252
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   253
	EPHYAR			= 0x80,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   254
#define	EPHYAR_FLAG			0x80000000
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   255
#define	EPHYAR_WRITE_CMD		0x80000000
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   256
#define	EPHYAR_REG_MASK			0x1f
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   257
#define	EPHYAR_REG_SHIFT		16
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   258
#define	EPHYAR_DATA_MASK		0xffff
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   259
	DBG_REG			= 0xd1,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   260
#define	FIX_NAK_1			(1 << 4)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
#define	FIX_NAK_2			(1 << 3)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
	EFUSEAR			= 0xdc,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
#define	EFUSEAR_FLAG			0x80000000
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   264
#define	EFUSEAR_WRITE_CMD		0x80000000
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   265
#define	EFUSEAR_READ_CMD		0x00000000
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   266
#define	EFUSEAR_REG_MASK		0x03ff
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   267
#define	EFUSEAR_REG_SHIFT		8
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   268
#define	EFUSEAR_DATA_MASK		0xff
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   269
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   270
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   271
enum rtl_register_content {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   272
	/* InterruptStatusBits */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   273
	SYSErr		= 0x8000,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
	PCSTimeout	= 0x4000,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   275
	SWInt		= 0x0100,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   276
	TxDescUnavail	= 0x0080,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
	RxFIFOOver	= 0x0040,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
	LinkChg		= 0x0020,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
	RxOverflow	= 0x0010,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   280
	TxErr		= 0x0008,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   281
	TxOK		= 0x0004,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   282
	RxErr		= 0x0002,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   283
	RxOK		= 0x0001,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   284
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   285
	/* RxStatusDesc */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   286
	RxFOVF	= (1 << 23),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   287
	RxRWT	= (1 << 22),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   288
	RxRES	= (1 << 21),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   289
	RxRUNT	= (1 << 20),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   290
	RxCRC	= (1 << 19),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   291
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   292
	/* ChipCmdBits */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   293
	CmdReset	= 0x10,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   294
	CmdRxEnb	= 0x08,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   295
	CmdTxEnb	= 0x04,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   296
	RxBufEmpty	= 0x01,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   297
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   298
	/* TXPoll register p.5 */
4f6670f083f1 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 */
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   301
	FSWInt		= 0x01,		/* Forced software interrupt */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   302
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   303
	/* Cfg9346Bits */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   304
	Cfg9346_Lock	= 0x00,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   305
	Cfg9346_Unlock	= 0xc0,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   306
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   307
	/* rx_mode_bits */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   308
	AcceptErr	= 0x20,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   309
	AcceptRunt	= 0x10,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   310
	AcceptBroadcast	= 0x08,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   311
	AcceptMulticast	= 0x04,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   312
	AcceptMyPhys	= 0x02,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   313
	AcceptAllPhys	= 0x01,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   314
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   315
	/* RxConfigBits */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   316
	RxCfgFIFOShift	= 13,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   317
	RxCfgDMAShift	=  8,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   318
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   319
	/* TxConfigBits */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   320
	TxInterFrameGapShift = 24,
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   322
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   323
	/* Config1 register p.24 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   324
	LEDS1		= (1 << 7),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   325
	LEDS0		= (1 << 6),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   326
	MSIEnable	= (1 << 5),	/* Enable Message Signaled Interrupt */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   327
	Speed_down	= (1 << 4),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   328
	MEMMAP		= (1 << 3),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   329
	IOMAP		= (1 << 2),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   330
	VPD		= (1 << 1),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   331
	PMEnable	= (1 << 0),	/* Power Management Enable */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   332
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   333
	/* Config2 register p. 25 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   334
	PCI_Clock_66MHz = 0x01,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   335
	PCI_Clock_33MHz = 0x00,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   336
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   337
	/* Config3 register p.25 */
4f6670f083f1 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 */
4f6670f083f1 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 */
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   341
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   342
	/* Config5 register p.27 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   343
	BWF		= (1 << 6),	/* Accept Broadcast wakeup frame */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   344
	MWF		= (1 << 5),	/* Accept Multicast wakeup frame */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   345
	UWF		= (1 << 4),	/* Accept Unicast wakeup frame */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   346
	LanWake		= (1 << 1),	/* LanWake enable/disable */
4f6670f083f1 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# */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   348
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   349
	/* TBICSR p.28 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   350
	TBIReset	= 0x80000000,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
	TBILoopback	= 0x40000000,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   352
	TBINwEnable	= 0x20000000,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   353
	TBINwRestart	= 0x10000000,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   354
	TBILinkOk	= 0x02000000,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   355
	TBINwComplete	= 0x01000000,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
	/* CPlusCmd p.31 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   358
	EnableBist	= (1 << 15),	// 8168 8101
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
	Mac_dbgo_oe	= (1 << 14),	// 8168 8101
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
	Normal_mode	= (1 << 13),	// unused
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   361
	Force_half_dup	= (1 << 12),	// 8168 8101
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
	Force_rxflow_en	= (1 << 11),	// 8168 8101
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   363
	Force_txflow_en	= (1 << 10),	// 8168 8101
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
	Cxpl_dbg_sel	= (1 << 9),	// 8168 8101
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   365
	ASF		= (1 << 8),	// 8168 8101
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   366
	PktCntrDisable	= (1 << 7),	// 8168 8101
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   367
	Mac_dbgo_sel	= 0x001c,	// 8168
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   368
	RxVlan		= (1 << 6),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   369
	RxChkSum	= (1 << 5),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
	PCIDAC		= (1 << 4),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   371
	PCIMulRW	= (1 << 3),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
	INTT_0		= 0x0000,	// 8168
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
	INTT_1		= 0x0001,	// 8168
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   374
	INTT_2		= 0x0002,	// 8168
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   375
	INTT_3		= 0x0003,	// 8168
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
	/* rtl8169_PHYstatus */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   378
	TBI_Enable	= 0x80,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   379
	TxFlowCtrl	= 0x40,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
	RxFlowCtrl	= 0x20,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
	_1000bpsF	= 0x10,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   382
	_100bps		= 0x08,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   383
	_10bps		= 0x04,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   384
	LinkStatus	= 0x02,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   385
	FullDup		= 0x01,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   386
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   387
	/* _TBICSRBit */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   388
	TBILinkOK	= 0x02000000,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   389
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   390
	/* DumpCounterCommand */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
	CounterDump	= 0x8,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   392
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   393
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   394
enum desc_status_bit {
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   396
	RingEnd		= (1 << 30), /* End of descriptor ring */
4f6670f083f1 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 */
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   400
	/* Tx private */
4f6670f083f1 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) */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   402
	MSSShift	= 16,        /* MSS value position */
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   404
	IPCS		= (1 << 18), /* Calculate IP checksum */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
	UDPCS		= (1 << 17), /* Calculate UDP/IP checksum */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   406
	TCPCS		= (1 << 16), /* Calculate TCP/IP checksum */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   407
	TxVlanTag	= (1 << 17), /* Add VLAN tag */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   408
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   409
	/* Rx private */
4f6670f083f1 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 */
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   412
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   413
#define RxProtoUDP	(PID1)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   414
#define RxProtoTCP	(PID0)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   415
#define RxProtoIP	(PID1 | PID0)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   416
#define RxProtoMask	RxProtoIP
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   417
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   418
	IPFail		= (1 << 16), /* IP checksum failed */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   419
	UDPFail		= (1 << 15), /* UDP/IP checksum failed */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   420
	TCPFail		= (1 << 14), /* TCP/IP checksum failed */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   421
	RxVlanTag	= (1 << 16), /* VLAN tag available */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   422
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   423
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   424
#define RsvdMask	0x3fffc000
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   425
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   426
struct TxDesc {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   427
	__le32 opts1;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   428
	__le32 opts2;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   429
	__le64 addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   430
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   431
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   432
struct RxDesc {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   433
	__le32 opts1;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   434
	__le32 opts2;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   435
	__le64 addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   436
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   437
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   438
struct ring_info {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   439
	struct sk_buff	*skb;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   440
	u32		len;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   441
	u8		__pad[sizeof(void *) - sizeof(u32)];
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   442
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   443
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   444
enum features {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   445
	RTL_FEATURE_WOL		= (1 << 0),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   446
	RTL_FEATURE_MSI		= (1 << 1),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   447
	RTL_FEATURE_GMII	= (1 << 2),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   448
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   449
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   450
struct rtl8169_counters {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   451
	__le64	tx_packets;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   452
	__le64	rx_packets;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   453
	__le64	tx_errors;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   454
	__le32	rx_errors;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   455
	__le16	rx_missed;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   456
	__le16	align_errors;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   457
	__le32	tx_one_collision;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   458
	__le32	tx_multi_collision;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
	__le64	rx_unicast;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   460
	__le64	rx_broadcast;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   461
	__le32	rx_multicast;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   462
	__le16	tx_aborted;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   463
	__le16	tx_underun;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   464
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   465
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   466
struct rtl8169_private {
4f6670f083f1 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 */
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   469
	struct net_device *dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   470
	struct napi_struct napi;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   471
	spinlock_t lock;		/* spin lock flag */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   472
	u32 msg_enable;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   473
	int chipset;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   474
	int mac_version;
4f6670f083f1 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. */
4f6670f083f1 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. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   477
	u32 dirty_rx;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   478
	u32 dirty_tx;
4f6670f083f1 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 */
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   481
	dma_addr_t TxPhyAddr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   482
	dma_addr_t RxPhyAddr;
4f6670f083f1 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 */
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   485
	struct timer_list timer;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   486
	u16 cp_cmd;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   487
	u16 intr_event;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   488
	u16 napi_event;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   489
	u16 intr_mask;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   490
	int phy_1000_ctrl_reg;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   491
#ifdef CONFIG_R8169_VLAN
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   492
	struct vlan_group *vlgrp;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   493
#endif
4f6670f083f1 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);
4f6670f083f1 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 *);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   496
	void (*phy_reset_enable)(void __iomem *);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   497
	void (*hw_start)(struct net_device *);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   498
	unsigned int (*phy_reset_pending)(void __iomem *);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   499
	unsigned int (*link_ok)(void __iomem *);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   501
	int pcie_cap;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   502
	struct delayed_work task;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   503
	unsigned features;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   504
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   505
	struct mii_if_info mii;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   506
	struct rtl8169_counters counters;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   507
	u32 saved_wolopts;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   508
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   509
4f6670f083f1 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>");
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   512
module_param(use_dac, int, 0);
4f6670f083f1 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.");
4f6670f083f1 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);
4f6670f083f1 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)");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   516
MODULE_LICENSE("GPL");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   517
MODULE_VERSION(RTL8169_VERSION);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   518
4f6670f083f1 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);
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   521
				      struct net_device *dev);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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 *,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   530
				void __iomem *, u32 budget);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   535
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   536
static const unsigned int rtl8169_rx_config =
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   538
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   540
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   541
	int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   542
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   544
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   545
	for (i = 20; i > 0; i--) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   546
		/*
4f6670f083f1 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
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   548
		 * MII register.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   549
		 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   550
		if (!(RTL_R32(PHYAR) & 0x80000000))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   551
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   552
		udelay(25);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   553
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   554
	/*
4f6670f083f1 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
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   556
	 * complete indication, but before sending next command.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   557
	 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   558
	udelay(20);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   559
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   560
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   562
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   563
	int i, value = -1;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   564
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   566
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   567
	for (i = 20; i > 0; i--) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   568
		/*
4f6670f083f1 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
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   570
		 * the specified MII register.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   571
		 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   572
		if (RTL_R32(PHYAR) & 0x80000000) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   573
			value = RTL_R32(PHYAR) & 0xffff;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   574
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   575
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   576
		udelay(25);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   577
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   578
	/*
4f6670f083f1 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
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   580
	 * complete indication, but before sending next command.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   581
	 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   582
	udelay(20);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   583
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   584
	return value;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   585
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   586
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   588
{
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   590
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   591
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   593
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   594
	int val;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   595
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   596
	val = mdio_read(ioaddr, reg_addr);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   598
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   599
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   601
			   int val)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   602
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   603
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   604
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   605
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   606
	mdio_write(ioaddr, location, val);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   607
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   608
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   610
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   611
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   612
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   613
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   614
	return mdio_read(ioaddr, location);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   615
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   616
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   618
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   619
	unsigned int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   620
4f6670f083f1 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) |
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   623
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   624
	for (i = 0; i < 100; i++) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   625
		if (!(RTL_R32(EPHYAR) & EPHYAR_FLAG))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   626
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   627
		udelay(10);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   628
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   629
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   630
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   632
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   633
	u16 value = 0xffff;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   634
	unsigned int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   635
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   637
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   638
	for (i = 0; i < 100; i++) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   639
		if (RTL_R32(EPHYAR) & EPHYAR_FLAG) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   640
			value = RTL_R32(EPHYAR) & EPHYAR_DATA_MASK;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   641
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   642
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   643
		udelay(10);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   644
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   645
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   646
	return value;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   647
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   648
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   650
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   651
	unsigned int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   652
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   653
	RTL_W32(CSIDR, value);
4f6670f083f1 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) |
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   655
		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   656
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   657
	for (i = 0; i < 100; i++) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   658
		if (!(RTL_R32(CSIAR) & CSIAR_FLAG))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   659
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   660
		udelay(10);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   661
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   662
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   663
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   665
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   666
	u32 value = ~0x00;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   667
	unsigned int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   668
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   669
	RTL_W32(CSIAR, (addr & CSIAR_ADDR_MASK) |
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   670
		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   671
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   672
	for (i = 0; i < 100; i++) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   673
		if (RTL_R32(CSIAR) & CSIAR_FLAG) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   674
			value = RTL_R32(CSIDR);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   675
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   676
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   677
		udelay(10);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   678
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   679
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   680
	return value;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   681
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   682
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   684
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   685
	u8 value = 0xff;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   686
	unsigned int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   687
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   689
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   690
	for (i = 0; i < 300; i++) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   691
		if (RTL_R32(EFUSEAR) & EFUSEAR_FLAG) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   692
			value = RTL_R32(EFUSEAR) & EFUSEAR_DATA_MASK;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   693
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   694
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   695
		udelay(100);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   696
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   697
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   698
	return value;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   699
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   700
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   702
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   703
	RTL_W16(IntrMask, 0x0000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   704
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   705
	RTL_W16(IntrStatus, 0xffff);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   706
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   707
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   709
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   710
	RTL_W8(ChipCmd, 0x00);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   711
	rtl8169_irq_mask_and_ack(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   712
	RTL_R16(CPlusCmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   713
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   714
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   716
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   717
	return RTL_R32(TBICSR) & TBIReset;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   718
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   719
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   721
{
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   723
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   724
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   726
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   727
	return RTL_R32(TBICSR) & TBILinkOk;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   728
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   729
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   731
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   732
	return RTL_R8(PHYstatus) & LinkStatus;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   733
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   734
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   736
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   737
	RTL_W32(TBICSR, RTL_R32(TBICSR) | TBIReset);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   738
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   739
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   741
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   742
	unsigned int val;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   743
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   745
	mdio_write(ioaddr, MII_BMCR, val & 0xffff);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   746
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   747
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   749
				      struct rtl8169_private *tp,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   750
				      void __iomem *ioaddr,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   751
				      bool pm)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   752
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   753
	unsigned long flags;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   754
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   755
	spin_lock_irqsave(&tp->lock, flags);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   756
	if (tp->link_ok(ioaddr)) {
4f6670f083f1 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. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   758
		if (pm)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   759
			pm_request_resume(&tp->pci_dev->dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   760
		netif_carrier_on(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   761
		if (net_ratelimit())
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   763
	} else {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   764
		netif_carrier_off(dev);
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   766
		if (pm)
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   768
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   769
	spin_unlock_irqrestore(&tp->lock, flags);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   770
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   771
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   773
				      struct rtl8169_private *tp,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   774
				      void __iomem *ioaddr)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   775
{
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   777
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   778
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   780
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   782
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   783
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   784
	u8 options;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   785
	u32 wolopts = 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   786
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   787
	options = RTL_R8(Config1);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   788
	if (!(options & PMEnable))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   789
		return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   790
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   791
	options = RTL_R8(Config3);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   792
	if (options & LinkUp)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   793
		wolopts |= WAKE_PHY;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   794
	if (options & MagicPacket)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   795
		wolopts |= WAKE_MAGIC;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   796
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   797
	options = RTL_R8(Config5);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   798
	if (options & UWF)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   799
		wolopts |= WAKE_UCAST;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   800
	if (options & BWF)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   801
		wolopts |= WAKE_BCAST;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   802
	if (options & MWF)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   803
		wolopts |= WAKE_MCAST;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   804
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   805
	return wolopts;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   806
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   807
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   809
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   810
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   811
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   812
	spin_lock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   813
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   814
	wol->supported = WAKE_ANY;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   815
	wol->wolopts = __rtl8169_get_wol(tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   816
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   817
	spin_unlock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   818
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   819
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   821
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   822
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   823
	unsigned int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   824
	static const struct {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   825
		u32 opt;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   826
		u16 reg;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   827
		u8  mask;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   828
	} cfg[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   829
		{ WAKE_ANY,   Config1, PMEnable },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   830
		{ WAKE_PHY,   Config3, LinkUp },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   831
		{ WAKE_MAGIC, Config3, MagicPacket },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   832
		{ WAKE_UCAST, Config5, UWF },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   833
		{ WAKE_BCAST, Config5, BWF },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   834
		{ WAKE_MCAST, Config5, MWF },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   835
		{ WAKE_ANY,   Config5, LanWake }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   836
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   837
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   838
	RTL_W8(Cfg9346, Cfg9346_Unlock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   839
4f6670f083f1 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++) {
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   842
		if (wolopts & cfg[i].opt)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   843
			options |= cfg[i].mask;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   844
		RTL_W8(cfg[i].reg, options);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   845
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   846
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   847
	RTL_W8(Cfg9346, Cfg9346_Lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   848
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   849
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   851
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   852
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   853
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   854
	spin_lock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   855
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   856
	if (wol->wolopts)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   857
		tp->features |= RTL_FEATURE_WOL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   858
	else
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   859
		tp->features &= ~RTL_FEATURE_WOL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   860
	__rtl8169_set_wol(tp, wol->wolopts);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   861
	spin_unlock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   862
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   864
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   865
	return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   866
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   867
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   869
				struct ethtool_drvinfo *info)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   870
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   871
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   872
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   873
	strcpy(info->driver, MODULENAME);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   874
	strcpy(info->version, RTL8169_VERSION);
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   876
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   877
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   879
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   880
	return R8169_REGS_SIZE;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   881
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   882
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   884
				 u8 autoneg, u16 speed, u8 duplex)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   885
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   886
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   887
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   888
	int ret = 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   889
	u32 reg;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   890
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   891
	reg = RTL_R32(TBICSR);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   892
	if ((autoneg == AUTONEG_DISABLE) && (speed == SPEED_1000) &&
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   893
	    (duplex == DUPLEX_FULL)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   894
		RTL_W32(TBICSR, reg & ~(TBINwEnable | TBINwRestart));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   895
	} else if (autoneg == AUTONEG_ENABLE)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   896
		RTL_W32(TBICSR, reg | TBINwEnable | TBINwRestart);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   897
	else {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   898
		netif_warn(tp, link, dev,
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   900
		ret = -EOPNOTSUPP;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   901
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   902
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   903
	return ret;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   904
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   905
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   907
				  u8 autoneg, u16 speed, u8 duplex)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   908
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   909
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   910
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   911
	int giga_ctrl, bmcr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   912
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   913
	if (autoneg == AUTONEG_ENABLE) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   914
		int auto_nego;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   915
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   916
		auto_nego = mdio_read(ioaddr, MII_ADVERTISE);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   917
		auto_nego |= (ADVERTISE_10HALF | ADVERTISE_10FULL |
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   918
			      ADVERTISE_100HALF | ADVERTISE_100FULL);
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   920
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   921
		giga_ctrl = mdio_read(ioaddr, MII_CTRL1000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   922
		giga_ctrl &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   923
4f6670f083f1 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. */
4f6670f083f1 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) &&
4f6670f083f1 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) &&
4f6670f083f1 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) &&
4f6670f083f1 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) &&
4f6670f083f1 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) &&
4f6670f083f1 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) &&
4f6670f083f1 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) &&
4f6670f083f1 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)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   933
			giga_ctrl |= ADVERTISE_1000FULL | ADVERTISE_1000HALF;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   934
		} else {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   935
			netif_info(tp, link, dev,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   936
				   "PHY does not support 1000Mbps\n");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   937
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   938
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   939
		bmcr = BMCR_ANENABLE | BMCR_ANRESTART;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   940
4f6670f083f1 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) ||
4f6670f083f1 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) ||
4f6670f083f1 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)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   944
			/*
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   945
			 * Wake up the PHY.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   946
			 * Vendor specific (0x1f) and reserved (0x0e) MII
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   947
			 * registers.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   948
			 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   949
			mdio_write(ioaddr, 0x1f, 0x0000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   950
			mdio_write(ioaddr, 0x0e, 0x0000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   951
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   952
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   953
		mdio_write(ioaddr, MII_ADVERTISE, auto_nego);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   954
		mdio_write(ioaddr, MII_CTRL1000, giga_ctrl);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   955
	} else {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   956
		giga_ctrl = 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   957
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   958
		if (speed == SPEED_10)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   959
			bmcr = 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   960
		else if (speed == SPEED_100)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   961
			bmcr = BMCR_SPEED100;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   962
		else
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   963
			return -EINVAL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   964
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   965
		if (duplex == DUPLEX_FULL)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   966
			bmcr |= BMCR_FULLDPLX;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   967
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   968
		mdio_write(ioaddr, 0x1f, 0x0000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   969
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   970
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   971
	tp->phy_1000_ctrl_reg = giga_ctrl;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   972
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   973
	mdio_write(ioaddr, MII_BMCR, bmcr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   974
4f6670f083f1 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) ||
4f6670f083f1 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)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   977
		if ((speed == SPEED_100) && (autoneg != AUTONEG_ENABLE)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   978
			mdio_write(ioaddr, 0x17, 0x2138);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   979
			mdio_write(ioaddr, 0x0e, 0x0260);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   980
		} else {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   981
			mdio_write(ioaddr, 0x17, 0x2108);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   982
			mdio_write(ioaddr, 0x0e, 0x0000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   983
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   984
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   985
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   986
	return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   987
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   988
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   990
			     u8 autoneg, u16 speed, u8 duplex)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   991
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   992
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   993
	int ret;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   994
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   996
4f6670f083f1 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))
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   999
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1000
	return ret;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1001
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1002
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1004
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1005
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1006
	unsigned long flags;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1007
	int ret;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1008
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1009
	spin_lock_irqsave(&tp->lock, flags);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1011
	spin_unlock_irqrestore(&tp->lock, flags);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1012
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1013
	return ret;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1014
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1015
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1017
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1018
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1019
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1020
	return tp->cp_cmd & RxChkSum;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1021
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1022
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1024
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1025
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1026
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1027
	unsigned long flags;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1028
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1029
	spin_lock_irqsave(&tp->lock, flags);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1030
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1031
	if (data)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1032
		tp->cp_cmd |= RxChkSum;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1033
	else
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1034
		tp->cp_cmd &= ~RxChkSum;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1035
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1036
	RTL_W16(CPlusCmd, tp->cp_cmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1037
	RTL_R16(CPlusCmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1038
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1039
	spin_unlock_irqrestore(&tp->lock, flags);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1040
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1041
	return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1042
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1043
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1044
#ifdef CONFIG_R8169_VLAN
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1045
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1047
				      struct sk_buff *skb)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1048
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1049
	return (vlan_tx_tag_present(skb)) ?
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1051
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1052
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1054
				     struct vlan_group *grp)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1055
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1056
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1057
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1058
	unsigned long flags;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1059
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1060
	spin_lock_irqsave(&tp->lock, flags);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1061
	tp->vlgrp = grp;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1062
	/*
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1063
	 * Do not disable RxVlan on 8110SCd.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1064
	 */
4f6670f083f1 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))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1066
		tp->cp_cmd |= RxVlan;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1067
	else
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1068
		tp->cp_cmd &= ~RxVlan;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1069
	RTL_W16(CPlusCmd, tp->cp_cmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1070
	RTL_R16(CPlusCmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1071
	spin_unlock_irqrestore(&tp->lock, flags);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1072
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1073
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1075
			       struct sk_buff *skb, int polling)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1076
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1077
	u32 opts2 = le32_to_cpu(desc->opts2);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1078
	struct vlan_group *vlgrp = tp->vlgrp;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1079
	int ret;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1080
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1081
	if (vlgrp && (opts2 & RxVlanTag)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1082
		u16 vtag = swab16(opts2 & 0xffff);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1083
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1084
		if (likely(polling))
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1086
		else
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1087
			__vlan_hwaccel_rx(skb, vlgrp, vtag, polling);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1088
		ret = 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1089
	} else
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1090
		ret = -1;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1091
	desc->opts2 = 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1092
	return ret;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1093
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1094
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1095
#else /* !CONFIG_R8169_VLAN */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1096
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1098
				      struct sk_buff *skb)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1099
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1100
	return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1101
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1102
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1104
			       struct sk_buff *skb, int polling)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1105
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1106
	return -1;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1107
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1108
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1109
#endif
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1110
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1112
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1113
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1114
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1115
	u32 status;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1116
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1117
	cmd->supported =
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1118
		SUPPORTED_1000baseT_Full | SUPPORTED_Autoneg | SUPPORTED_FIBRE;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1119
	cmd->port = PORT_FIBRE;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1120
	cmd->transceiver = XCVR_INTERNAL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1121
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1122
	status = RTL_R32(TBICSR);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1123
	cmd->advertising = (status & TBINwEnable) ?  ADVERTISED_Autoneg : 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1124
	cmd->autoneg = !!(status & TBINwEnable);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1125
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1126
	cmd->speed = SPEED_1000;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1127
	cmd->duplex = DUPLEX_FULL; /* Always set */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1128
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1129
	return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1130
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1131
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1133
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1134
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1135
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1136
	return mii_ethtool_gset(&tp->mii, cmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1137
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1138
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1140
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1141
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1142
	unsigned long flags;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1143
	int rc;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1144
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1145
	spin_lock_irqsave(&tp->lock, flags);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1146
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1147
	rc = tp->get_settings(dev, cmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1148
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1149
	spin_unlock_irqrestore(&tp->lock, flags);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1150
	return rc;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1151
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1152
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1154
			     void *p)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1155
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1156
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1157
	unsigned long flags;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1158
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1159
	if (regs->len > R8169_REGS_SIZE)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1160
		regs->len = R8169_REGS_SIZE;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1161
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1162
	spin_lock_irqsave(&tp->lock, flags);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1164
	spin_unlock_irqrestore(&tp->lock, flags);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1165
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1166
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1168
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1169
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1170
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1171
	return tp->msg_enable;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1172
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1173
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1175
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1176
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1177
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1178
	tp->msg_enable = value;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1179
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1180
4f6670f083f1 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] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1182
	"tx_packets",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1183
	"rx_packets",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1184
	"tx_errors",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1185
	"rx_errors",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1186
	"rx_missed",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1187
	"align_errors",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1188
	"tx_single_collisions",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1189
	"tx_multi_collisions",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1190
	"unicast",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1191
	"broadcast",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1192
	"multicast",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1193
	"tx_aborted",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1194
	"tx_underrun",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1195
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1196
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1198
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1199
	switch (sset) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1200
	case ETH_SS_STATS:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1201
		return ARRAY_SIZE(rtl8169_gstrings);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1202
	default:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1203
		return -EOPNOTSUPP;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1204
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1205
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1206
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1208
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1209
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1210
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1211
	struct rtl8169_counters *counters;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1212
	dma_addr_t paddr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1213
	u32 cmd;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1214
	int wait = 1000;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1215
	struct device *d = &tp->pci_dev->dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1216
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1217
	/*
4f6670f083f1 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
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1219
	 * is disabled.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1220
	 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1221
	if ((RTL_R8(ChipCmd) & CmdRxEnb) == 0)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1222
		return;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1223
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1225
	if (!counters)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1226
		return;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1227
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1228
	RTL_W32(CounterAddrHigh, (u64)paddr >> 32);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1229
	cmd = (u64)paddr & DMA_BIT_MASK(32);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1230
	RTL_W32(CounterAddrLow, cmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1231
	RTL_W32(CounterAddrLow, cmd | CounterDump);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1232
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1233
	while (wait--) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1234
		if ((RTL_R32(CounterAddrLow) & CounterDump) == 0) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1235
			/* copy updated counters */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1236
			memcpy(&tp->counters, counters, sizeof(*counters));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1237
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1238
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1239
		udelay(10);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1240
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1241
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1242
	RTL_W32(CounterAddrLow, 0);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1243
	RTL_W32(CounterAddrHigh, 0);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1244
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1246
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1247
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1249
				      struct ethtool_stats *stats, u64 *data)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1250
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1251
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1252
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1253
	ASSERT_RTNL();
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1254
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1255
	rtl8169_update_counters(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1256
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1270
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1271
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1273
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1274
	switch(stringset) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1275
	case ETH_SS_STATS:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1276
		memcpy(data, *rtl8169_gstrings, sizeof(rtl8169_gstrings));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1277
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1278
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1279
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1280
4f6670f083f1 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 = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1282
	.get_drvinfo		= rtl8169_get_drvinfo,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1283
	.get_regs_len		= rtl8169_get_regs_len,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1284
	.get_link		= ethtool_op_get_link,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1285
	.get_settings		= rtl8169_get_settings,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1286
	.set_settings		= rtl8169_set_settings,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1287
	.get_msglevel		= rtl8169_get_msglevel,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1288
	.set_msglevel		= rtl8169_set_msglevel,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1289
	.get_rx_csum		= rtl8169_get_rx_csum,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1290
	.set_rx_csum		= rtl8169_set_rx_csum,
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1292
	.set_sg			= ethtool_op_set_sg,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1293
	.set_tso		= ethtool_op_set_tso,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1294
	.get_regs		= rtl8169_get_regs,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1295
	.get_wol		= rtl8169_get_wol,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1296
	.set_wol		= rtl8169_set_wol,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1297
	.get_strings		= rtl8169_get_strings,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1298
	.get_sset_count		= rtl8169_get_sset_count,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1299
	.get_ethtool_stats	= rtl8169_get_ethtool_stats,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1300
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1301
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1303
				    void __iomem *ioaddr)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1304
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1305
	/*
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1308
	 * if needed:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1309
	 *
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1310
	 * (RTL_R32(TxConfig) & 0x700000) == 0x500000 ? 8168Bf : 8168Be
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1311
	 *
4f6670f083f1 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:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1313
	 *
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1314
	 * (RTL_R32(TxConfig) & 0x700000) == 0x200000 ? 8101Eb : 8101Ec
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1315
	 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1316
	static const struct {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1317
		u32 mask;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1318
		u32 val;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1319
		int mac_version;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1320
	} mac_info[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1321
		/* 8168D family. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1322
		{ 0x7cf00000, 0x28300000,	RTL_GIGA_MAC_VER_26 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1323
		{ 0x7cf00000, 0x28100000,	RTL_GIGA_MAC_VER_25 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1324
		{ 0x7c800000, 0x28800000,	RTL_GIGA_MAC_VER_27 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1325
		{ 0x7c800000, 0x28000000,	RTL_GIGA_MAC_VER_26 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1326
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1327
		/* 8168C family. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1328
		{ 0x7cf00000, 0x3cb00000,	RTL_GIGA_MAC_VER_24 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1329
		{ 0x7cf00000, 0x3c900000,	RTL_GIGA_MAC_VER_23 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1330
		{ 0x7cf00000, 0x3c800000,	RTL_GIGA_MAC_VER_18 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1331
		{ 0x7c800000, 0x3c800000,	RTL_GIGA_MAC_VER_24 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1332
		{ 0x7cf00000, 0x3c000000,	RTL_GIGA_MAC_VER_19 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1333
		{ 0x7cf00000, 0x3c200000,	RTL_GIGA_MAC_VER_20 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1334
		{ 0x7cf00000, 0x3c300000,	RTL_GIGA_MAC_VER_21 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1335
		{ 0x7cf00000, 0x3c400000,	RTL_GIGA_MAC_VER_22 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1336
		{ 0x7c800000, 0x3c000000,	RTL_GIGA_MAC_VER_22 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1337
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1338
		/* 8168B family. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1339
		{ 0x7cf00000, 0x38000000,	RTL_GIGA_MAC_VER_12 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1340
		{ 0x7cf00000, 0x38500000,	RTL_GIGA_MAC_VER_17 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1341
		{ 0x7c800000, 0x38000000,	RTL_GIGA_MAC_VER_17 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1342
		{ 0x7c800000, 0x30000000,	RTL_GIGA_MAC_VER_11 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1343
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1344
		/* 8101 family. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1345
		{ 0x7cf00000, 0x34a00000,	RTL_GIGA_MAC_VER_09 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1346
		{ 0x7cf00000, 0x24a00000,	RTL_GIGA_MAC_VER_09 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1347
		{ 0x7cf00000, 0x34900000,	RTL_GIGA_MAC_VER_08 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1348
		{ 0x7cf00000, 0x24900000,	RTL_GIGA_MAC_VER_08 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1349
		{ 0x7cf00000, 0x34800000,	RTL_GIGA_MAC_VER_07 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1350
		{ 0x7cf00000, 0x24800000,	RTL_GIGA_MAC_VER_07 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1351
		{ 0x7cf00000, 0x34000000,	RTL_GIGA_MAC_VER_13 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1352
		{ 0x7cf00000, 0x34300000,	RTL_GIGA_MAC_VER_10 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1353
		{ 0x7cf00000, 0x34200000,	RTL_GIGA_MAC_VER_16 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1354
		{ 0x7c800000, 0x34800000,	RTL_GIGA_MAC_VER_09 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1355
		{ 0x7c800000, 0x24800000,	RTL_GIGA_MAC_VER_09 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1356
		{ 0x7c800000, 0x34000000,	RTL_GIGA_MAC_VER_16 },
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1358
		{ 0xfc800000, 0x38800000,	RTL_GIGA_MAC_VER_15 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1359
		{ 0xfc800000, 0x30800000,	RTL_GIGA_MAC_VER_14 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1360
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1361
		/* 8110 family. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1362
		{ 0xfc800000, 0x98000000,	RTL_GIGA_MAC_VER_06 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1363
		{ 0xfc800000, 0x18000000,	RTL_GIGA_MAC_VER_05 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1364
		{ 0xfc800000, 0x10000000,	RTL_GIGA_MAC_VER_04 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1365
		{ 0xfc800000, 0x04000000,	RTL_GIGA_MAC_VER_03 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1366
		{ 0xfc800000, 0x00800000,	RTL_GIGA_MAC_VER_02 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1367
		{ 0xfc800000, 0x00000000,	RTL_GIGA_MAC_VER_01 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1368
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1369
		/* Catch-all */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1370
		{ 0x00000000, 0x00000000,	RTL_GIGA_MAC_NONE   }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1371
	}, *p = mac_info;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1372
	u32 reg;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1373
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1374
	reg = RTL_R32(TxConfig);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1375
	while ((reg & p->mask) != p->val)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1376
		p++;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1377
	tp->mac_version = p->mac_version;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1378
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1379
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1381
{
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1383
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1384
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1385
struct phy_reg {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1386
	u16 reg;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1387
	u16 val;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1388
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1389
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1391
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1392
	while (len-- > 0) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1393
		mdio_write(ioaddr, regs->reg, regs->val);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1394
		regs++;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1395
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1396
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1397
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1399
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1401
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1402
		{ 0x06, 0x006e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1403
		{ 0x08, 0x0708 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1404
		{ 0x15, 0x4000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1405
		{ 0x18, 0x65c7 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1406
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1407
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1408
		{ 0x03, 0x00a1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1409
		{ 0x02, 0x0008 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1410
		{ 0x01, 0x0120 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1411
		{ 0x00, 0x1000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1412
		{ 0x04, 0x0800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1413
		{ 0x04, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1414
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1415
		{ 0x03, 0xff41 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1416
		{ 0x02, 0xdf60 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1417
		{ 0x01, 0x0140 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1418
		{ 0x00, 0x0077 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1419
		{ 0x04, 0x7800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1420
		{ 0x04, 0x7000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1421
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1422
		{ 0x03, 0x802f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1423
		{ 0x02, 0x4f02 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1424
		{ 0x01, 0x0409 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1425
		{ 0x00, 0xf0f9 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1426
		{ 0x04, 0x9800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1427
		{ 0x04, 0x9000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1428
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1429
		{ 0x03, 0xdf01 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1430
		{ 0x02, 0xdf20 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1431
		{ 0x01, 0xff95 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1432
		{ 0x00, 0xba00 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1433
		{ 0x04, 0xa800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1434
		{ 0x04, 0xa000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1435
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1436
		{ 0x03, 0xff41 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1437
		{ 0x02, 0xdf20 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1438
		{ 0x01, 0x0140 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1439
		{ 0x00, 0x00bb },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1440
		{ 0x04, 0xb800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1441
		{ 0x04, 0xb000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1442
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1443
		{ 0x03, 0xdf41 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1444
		{ 0x02, 0xdc60 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1445
		{ 0x01, 0x6340 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1446
		{ 0x00, 0x007d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1447
		{ 0x04, 0xd800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1448
		{ 0x04, 0xd000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1449
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1450
		{ 0x03, 0xdf01 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1451
		{ 0x02, 0xdf20 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1452
		{ 0x01, 0x100a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1453
		{ 0x00, 0xa0ff },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1454
		{ 0x04, 0xf800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1455
		{ 0x04, 0xf000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1456
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1457
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1458
		{ 0x0b, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1459
		{ 0x00, 0x9200 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1460
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1461
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1463
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1464
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1466
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1468
		{ 0x1f, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1469
		{ 0x01, 0x90d0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1470
		{ 0x1f, 0x0000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1471
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1472
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1474
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1475
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1477
					   void __iomem *ioaddr)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1478
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1479
	struct pci_dev *pdev = tp->pci_dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1480
	u16 vendor_id, device_id;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1481
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1484
4f6670f083f1 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))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1486
		return;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1487
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1488
	mdio_write(ioaddr, 0x1f, 0x0001);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1489
	mdio_write(ioaddr, 0x10, 0xf01b);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1490
	mdio_write(ioaddr, 0x1f, 0x0000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1491
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1492
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1494
				     void __iomem *ioaddr)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1495
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1497
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1498
		{ 0x04, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1499
		{ 0x03, 0x00a1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1500
		{ 0x02, 0x0008 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1501
		{ 0x01, 0x0120 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1502
		{ 0x00, 0x1000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1503
		{ 0x04, 0x0800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1504
		{ 0x04, 0x9000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1505
		{ 0x03, 0x802f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1506
		{ 0x02, 0x4f02 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1507
		{ 0x01, 0x0409 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1508
		{ 0x00, 0xf099 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1509
		{ 0x04, 0x9800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1510
		{ 0x04, 0xa000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1511
		{ 0x03, 0xdf01 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1512
		{ 0x02, 0xdf20 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1513
		{ 0x01, 0xff95 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1514
		{ 0x00, 0xba00 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1515
		{ 0x04, 0xa800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1516
		{ 0x04, 0xf000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1517
		{ 0x03, 0xdf01 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1518
		{ 0x02, 0xdf20 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1519
		{ 0x01, 0x101a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1520
		{ 0x00, 0xa0ff },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1521
		{ 0x04, 0xf800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1522
		{ 0x04, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1523
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1524
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1525
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1526
		{ 0x10, 0xf41b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1527
		{ 0x14, 0xfb54 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1528
		{ 0x18, 0xf5c7 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1529
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1530
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1531
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1532
		{ 0x17, 0x0cc0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1533
		{ 0x1f, 0x0000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1534
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1535
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1537
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1538
	rtl8169scd_hw_phy_config_quirk(tp, ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1539
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1540
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1542
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1544
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1545
		{ 0x04, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1546
		{ 0x03, 0x00a1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1547
		{ 0x02, 0x0008 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1548
		{ 0x01, 0x0120 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1549
		{ 0x00, 0x1000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1550
		{ 0x04, 0x0800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1551
		{ 0x04, 0x9000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1552
		{ 0x03, 0x802f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1553
		{ 0x02, 0x4f02 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1554
		{ 0x01, 0x0409 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1555
		{ 0x00, 0xf099 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1556
		{ 0x04, 0x9800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1557
		{ 0x04, 0xa000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1558
		{ 0x03, 0xdf01 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1559
		{ 0x02, 0xdf20 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1560
		{ 0x01, 0xff95 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1561
		{ 0x00, 0xba00 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1562
		{ 0x04, 0xa800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1563
		{ 0x04, 0xf000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1564
		{ 0x03, 0xdf01 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1565
		{ 0x02, 0xdf20 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1566
		{ 0x01, 0x101a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1567
		{ 0x00, 0xa0ff },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1568
		{ 0x04, 0xf800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1569
		{ 0x04, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1570
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1571
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1572
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1573
		{ 0x0b, 0x8480 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1574
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1575
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1576
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1577
		{ 0x18, 0x67c7 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1578
		{ 0x04, 0x2000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1579
		{ 0x03, 0x002f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1580
		{ 0x02, 0x4360 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1581
		{ 0x01, 0x0109 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1582
		{ 0x00, 0x3022 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1583
		{ 0x04, 0x2800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1584
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1585
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1586
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1587
		{ 0x17, 0x0cc0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1588
		{ 0x1f, 0x0000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1589
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1590
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1592
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1593
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1595
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1597
		{ 0x10, 0xf41b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1598
		{ 0x1f, 0x0000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1599
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1600
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1601
	mdio_write(ioaddr, 0x1f, 0x0001);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1602
	mdio_patch(ioaddr, 0x16, 1 << 0);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1603
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1605
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1606
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1608
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1610
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1611
		{ 0x10, 0xf41b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1612
		{ 0x1f, 0x0000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1613
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1614
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1616
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1617
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1619
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1621
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1622
		{ 0x1d, 0x0f00 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1623
		{ 0x1f, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1624
		{ 0x0c, 0x1ec8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1625
		{ 0x1f, 0x0000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1626
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1627
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1629
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1630
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1632
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1634
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1635
		{ 0x1d, 0x3d98 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1636
		{ 0x1f, 0x0000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1637
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1638
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1639
	mdio_write(ioaddr, 0x1f, 0x0000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1640
	mdio_patch(ioaddr, 0x14, 1 << 5);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1641
	mdio_patch(ioaddr, 0x0d, 1 << 5);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1642
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1644
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1645
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1647
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1649
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1650
		{ 0x12, 0x2300 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1651
		{ 0x1f, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1652
		{ 0x00, 0x88d4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1653
		{ 0x01, 0x82b1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1654
		{ 0x03, 0x7002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1655
		{ 0x08, 0x9e30 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1656
		{ 0x09, 0x01f0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1657
		{ 0x0a, 0x5500 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1658
		{ 0x0c, 0x00c8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1659
		{ 0x1f, 0x0003 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1660
		{ 0x12, 0xc096 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1661
		{ 0x16, 0x000a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1662
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1663
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1664
		{ 0x09, 0x2000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1665
		{ 0x09, 0x0000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1666
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1667
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1669
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1670
	mdio_patch(ioaddr, 0x14, 1 << 5);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1671
	mdio_patch(ioaddr, 0x0d, 1 << 5);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1672
	mdio_write(ioaddr, 0x1f, 0x0000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1673
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1674
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1676
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1678
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1679
		{ 0x12, 0x2300 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1680
		{ 0x03, 0x802f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1681
		{ 0x02, 0x4f02 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1682
		{ 0x01, 0x0409 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1683
		{ 0x00, 0xf099 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1684
		{ 0x04, 0x9800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1685
		{ 0x04, 0x9000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1686
		{ 0x1d, 0x3d98 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1687
		{ 0x1f, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1688
		{ 0x0c, 0x7eb8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1689
		{ 0x06, 0x0761 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1690
		{ 0x1f, 0x0003 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1691
		{ 0x16, 0x0f0a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1692
		{ 0x1f, 0x0000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1693
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1694
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1696
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1697
	mdio_patch(ioaddr, 0x16, 1 << 0);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1698
	mdio_patch(ioaddr, 0x14, 1 << 5);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1699
	mdio_patch(ioaddr, 0x0d, 1 << 5);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1700
	mdio_write(ioaddr, 0x1f, 0x0000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1701
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1702
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1704
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1706
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1707
		{ 0x12, 0x2300 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1708
		{ 0x1d, 0x3d98 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1709
		{ 0x1f, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1710
		{ 0x0c, 0x7eb8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1711
		{ 0x06, 0x5461 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1712
		{ 0x1f, 0x0003 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1713
		{ 0x16, 0x0f0a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1714
		{ 0x1f, 0x0000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1715
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1716
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1718
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1719
	mdio_patch(ioaddr, 0x16, 1 << 0);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1720
	mdio_patch(ioaddr, 0x14, 1 << 5);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1721
	mdio_patch(ioaddr, 0x0d, 1 << 5);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1722
	mdio_write(ioaddr, 0x1f, 0x0000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1723
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1724
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1726
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1727
	rtl8168c_3_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1728
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1729
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1731
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1733
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1734
		{ 0x06, 0x4064 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1735
		{ 0x07, 0x2863 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1736
		{ 0x08, 0x059c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1737
		{ 0x09, 0x26b4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1738
		{ 0x0a, 0x6a19 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1739
		{ 0x0b, 0xdcc8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1740
		{ 0x10, 0xf06d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1741
		{ 0x14, 0x7f68 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1742
		{ 0x18, 0x7fd9 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1743
		{ 0x1c, 0xf0ff },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1744
		{ 0x1d, 0x3d9c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1745
		{ 0x1f, 0x0003 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1746
		{ 0x12, 0xf49f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1747
		{ 0x13, 0x070b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1748
		{ 0x1a, 0x05ad },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1749
		{ 0x14, 0x94c0 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1750
	};
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1752
		{ 0x1f, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1753
		{ 0x06, 0x5561 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1754
		{ 0x1f, 0x0005 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1755
		{ 0x05, 0x8332 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1756
		{ 0x06, 0x5561 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1757
	};
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1759
		{ 0x1f, 0x0005 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1760
		{ 0x05, 0xffc2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1761
		{ 0x1f, 0x0005 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1762
		{ 0x05, 0x8000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1763
		{ 0x06, 0xf8f9 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1764
		{ 0x06, 0xfaef },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1765
		{ 0x06, 0x59ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1766
		{ 0x06, 0xf8ea },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1767
		{ 0x06, 0x00ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1768
		{ 0x06, 0xf8eb },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1769
		{ 0x06, 0x00e0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1770
		{ 0x06, 0xf87c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1771
		{ 0x06, 0xe1f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1772
		{ 0x06, 0x7d59 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1773
		{ 0x06, 0x0fef },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1774
		{ 0x06, 0x0139 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1775
		{ 0x06, 0x029e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1776
		{ 0x06, 0x06ef },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1777
		{ 0x06, 0x1039 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1778
		{ 0x06, 0x089f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1779
		{ 0x06, 0x2aee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1780
		{ 0x06, 0xf8ea },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1781
		{ 0x06, 0x00ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1782
		{ 0x06, 0xf8eb },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1783
		{ 0x06, 0x01e0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1784
		{ 0x06, 0xf87c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1785
		{ 0x06, 0xe1f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1786
		{ 0x06, 0x7d58 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1787
		{ 0x06, 0x409e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1788
		{ 0x06, 0x0f39 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1789
		{ 0x06, 0x46aa },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1790
		{ 0x06, 0x0bbf },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1791
		{ 0x06, 0x8290 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1792
		{ 0x06, 0xd682 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1793
		{ 0x06, 0x9802 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1794
		{ 0x06, 0x014f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1795
		{ 0x06, 0xae09 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1796
		{ 0x06, 0xbf82 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1797
		{ 0x06, 0x98d6 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1798
		{ 0x06, 0x82a0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1799
		{ 0x06, 0x0201 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1800
		{ 0x06, 0x4fef },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1801
		{ 0x06, 0x95fe },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1802
		{ 0x06, 0xfdfc },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1803
		{ 0x06, 0x05f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1804
		{ 0x06, 0xf9fa },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1805
		{ 0x06, 0xeef8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1806
		{ 0x06, 0xea00 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1807
		{ 0x06, 0xeef8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1808
		{ 0x06, 0xeb00 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1809
		{ 0x06, 0xe2f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1810
		{ 0x06, 0x7ce3 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1811
		{ 0x06, 0xf87d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1812
		{ 0x06, 0xa511 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1813
		{ 0x06, 0x1112 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1814
		{ 0x06, 0xd240 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1815
		{ 0x06, 0xd644 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1816
		{ 0x06, 0x4402 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1817
		{ 0x06, 0x8217 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1818
		{ 0x06, 0xd2a0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1819
		{ 0x06, 0xd6aa },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1820
		{ 0x06, 0xaa02 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1821
		{ 0x06, 0x8217 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1822
		{ 0x06, 0xae0f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1823
		{ 0x06, 0xa544 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1824
		{ 0x06, 0x4402 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1825
		{ 0x06, 0xae4d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1826
		{ 0x06, 0xa5aa },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1827
		{ 0x06, 0xaa02 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1828
		{ 0x06, 0xae47 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1829
		{ 0x06, 0xaf82 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1830
		{ 0x06, 0x13ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1831
		{ 0x06, 0x834e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1832
		{ 0x06, 0x00ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1833
		{ 0x06, 0x834d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1834
		{ 0x06, 0x0fee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1835
		{ 0x06, 0x834c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1836
		{ 0x06, 0x0fee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1837
		{ 0x06, 0x834f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1838
		{ 0x06, 0x00ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1839
		{ 0x06, 0x8351 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1840
		{ 0x06, 0x00ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1841
		{ 0x06, 0x834a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1842
		{ 0x06, 0xffee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1843
		{ 0x06, 0x834b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1844
		{ 0x06, 0xffe0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1845
		{ 0x06, 0x8330 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1846
		{ 0x06, 0xe183 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1847
		{ 0x06, 0x3158 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1848
		{ 0x06, 0xfee4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1849
		{ 0x06, 0xf88a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1850
		{ 0x06, 0xe5f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1851
		{ 0x06, 0x8be0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1852
		{ 0x06, 0x8332 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1853
		{ 0x06, 0xe183 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1854
		{ 0x06, 0x3359 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1855
		{ 0x06, 0x0fe2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1856
		{ 0x06, 0x834d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1857
		{ 0x06, 0x0c24 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1858
		{ 0x06, 0x5af0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1859
		{ 0x06, 0x1e12 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1860
		{ 0x06, 0xe4f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1861
		{ 0x06, 0x8ce5 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1862
		{ 0x06, 0xf88d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1863
		{ 0x06, 0xaf82 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1864
		{ 0x06, 0x13e0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1865
		{ 0x06, 0x834f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1866
		{ 0x06, 0x10e4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1867
		{ 0x06, 0x834f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1868
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1869
		{ 0x06, 0x4e78 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1870
		{ 0x06, 0x009f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1871
		{ 0x06, 0x0ae0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1872
		{ 0x06, 0x834f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1873
		{ 0x06, 0xa010 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1874
		{ 0x06, 0xa5ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1875
		{ 0x06, 0x834e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1876
		{ 0x06, 0x01e0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1877
		{ 0x06, 0x834e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1878
		{ 0x06, 0x7805 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1879
		{ 0x06, 0x9e9a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1880
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1881
		{ 0x06, 0x4e78 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1882
		{ 0x06, 0x049e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1883
		{ 0x06, 0x10e0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1884
		{ 0x06, 0x834e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1885
		{ 0x06, 0x7803 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1886
		{ 0x06, 0x9e0f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1887
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1888
		{ 0x06, 0x4e78 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1889
		{ 0x06, 0x019e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1890
		{ 0x06, 0x05ae },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1891
		{ 0x06, 0x0caf },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1892
		{ 0x06, 0x81f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1893
		{ 0x06, 0xaf81 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1894
		{ 0x06, 0xa3af },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1895
		{ 0x06, 0x81dc },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1896
		{ 0x06, 0xaf82 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1897
		{ 0x06, 0x13ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1898
		{ 0x06, 0x8348 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1899
		{ 0x06, 0x00ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1900
		{ 0x06, 0x8349 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1901
		{ 0x06, 0x00e0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1902
		{ 0x06, 0x8351 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1903
		{ 0x06, 0x10e4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1904
		{ 0x06, 0x8351 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1905
		{ 0x06, 0x5801 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1906
		{ 0x06, 0x9fea },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1907
		{ 0x06, 0xd000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1908
		{ 0x06, 0xd180 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1909
		{ 0x06, 0x1f66 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1910
		{ 0x06, 0xe2f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1911
		{ 0x06, 0xeae3 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1912
		{ 0x06, 0xf8eb },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1913
		{ 0x06, 0x5af8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1914
		{ 0x06, 0x1e20 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1915
		{ 0x06, 0xe6f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1916
		{ 0x06, 0xeae5 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1917
		{ 0x06, 0xf8eb },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1918
		{ 0x06, 0xd302 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1919
		{ 0x06, 0xb3fe },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1920
		{ 0x06, 0xe2f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1921
		{ 0x06, 0x7cef },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1922
		{ 0x06, 0x325b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1923
		{ 0x06, 0x80e3 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1924
		{ 0x06, 0xf87d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1925
		{ 0x06, 0x9e03 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1926
		{ 0x06, 0x7dff },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1927
		{ 0x06, 0xff0d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1928
		{ 0x06, 0x581c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1929
		{ 0x06, 0x551a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1930
		{ 0x06, 0x6511 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1931
		{ 0x06, 0xa190 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1932
		{ 0x06, 0xd3e2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1933
		{ 0x06, 0x8348 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1934
		{ 0x06, 0xe383 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1935
		{ 0x06, 0x491b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1936
		{ 0x06, 0x56ab },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1937
		{ 0x06, 0x08ef },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1938
		{ 0x06, 0x56e6 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1939
		{ 0x06, 0x8348 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1940
		{ 0x06, 0xe783 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1941
		{ 0x06, 0x4910 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1942
		{ 0x06, 0xd180 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1943
		{ 0x06, 0x1f66 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1944
		{ 0x06, 0xa004 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1945
		{ 0x06, 0xb9e2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1946
		{ 0x06, 0x8348 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1947
		{ 0x06, 0xe383 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1948
		{ 0x06, 0x49ef },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1949
		{ 0x06, 0x65e2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1950
		{ 0x06, 0x834a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1951
		{ 0x06, 0xe383 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1952
		{ 0x06, 0x4b1b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1953
		{ 0x06, 0x56aa },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1954
		{ 0x06, 0x0eef },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1955
		{ 0x06, 0x56e6 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1956
		{ 0x06, 0x834a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1957
		{ 0x06, 0xe783 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1958
		{ 0x06, 0x4be2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1959
		{ 0x06, 0x834d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1960
		{ 0x06, 0xe683 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1961
		{ 0x06, 0x4ce0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1962
		{ 0x06, 0x834d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1963
		{ 0x06, 0xa000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1964
		{ 0x06, 0x0caf },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1965
		{ 0x06, 0x81dc },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1966
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1967
		{ 0x06, 0x4d10 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1968
		{ 0x06, 0xe483 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1969
		{ 0x06, 0x4dae },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1970
		{ 0x06, 0x0480 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1971
		{ 0x06, 0xe483 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1972
		{ 0x06, 0x4de0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1973
		{ 0x06, 0x834e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1974
		{ 0x06, 0x7803 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1975
		{ 0x06, 0x9e0b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1976
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1977
		{ 0x06, 0x4e78 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1978
		{ 0x06, 0x049e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1979
		{ 0x06, 0x04ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1980
		{ 0x06, 0x834e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1981
		{ 0x06, 0x02e0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1982
		{ 0x06, 0x8332 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1983
		{ 0x06, 0xe183 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1984
		{ 0x06, 0x3359 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1985
		{ 0x06, 0x0fe2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1986
		{ 0x06, 0x834d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1987
		{ 0x06, 0x0c24 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1988
		{ 0x06, 0x5af0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1989
		{ 0x06, 0x1e12 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1990
		{ 0x06, 0xe4f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1991
		{ 0x06, 0x8ce5 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1992
		{ 0x06, 0xf88d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1993
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1994
		{ 0x06, 0x30e1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1995
		{ 0x06, 0x8331 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1996
		{ 0x06, 0x6801 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1997
		{ 0x06, 0xe4f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1998
		{ 0x06, 0x8ae5 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1999
		{ 0x06, 0xf88b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2000
		{ 0x06, 0xae37 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2001
		{ 0x06, 0xee83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2002
		{ 0x06, 0x4e03 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2003
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2004
		{ 0x06, 0x4ce1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2005
		{ 0x06, 0x834d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2006
		{ 0x06, 0x1b01 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2007
		{ 0x06, 0x9e04 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2008
		{ 0x06, 0xaaa1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2009
		{ 0x06, 0xaea8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2010
		{ 0x06, 0xee83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2011
		{ 0x06, 0x4e04 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2012
		{ 0x06, 0xee83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2013
		{ 0x06, 0x4f00 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2014
		{ 0x06, 0xaeab },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2015
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2016
		{ 0x06, 0x4f78 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2017
		{ 0x06, 0x039f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2018
		{ 0x06, 0x14ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2019
		{ 0x06, 0x834e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2020
		{ 0x06, 0x05d2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2021
		{ 0x06, 0x40d6 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2022
		{ 0x06, 0x5554 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2023
		{ 0x06, 0x0282 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2024
		{ 0x06, 0x17d2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2025
		{ 0x06, 0xa0d6 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2026
		{ 0x06, 0xba00 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2027
		{ 0x06, 0x0282 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2028
		{ 0x06, 0x17fe },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2029
		{ 0x06, 0xfdfc },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2030
		{ 0x06, 0x05f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2031
		{ 0x06, 0xe0f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2032
		{ 0x06, 0x60e1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2033
		{ 0x06, 0xf861 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2034
		{ 0x06, 0x6802 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2035
		{ 0x06, 0xe4f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2036
		{ 0x06, 0x60e5 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2037
		{ 0x06, 0xf861 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2038
		{ 0x06, 0xe0f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2039
		{ 0x06, 0x48e1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2040
		{ 0x06, 0xf849 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2041
		{ 0x06, 0x580f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2042
		{ 0x06, 0x1e02 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2043
		{ 0x06, 0xe4f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2044
		{ 0x06, 0x48e5 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2045
		{ 0x06, 0xf849 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2046
		{ 0x06, 0xd000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2047
		{ 0x06, 0x0282 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2048
		{ 0x06, 0x5bbf },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2049
		{ 0x06, 0x8350 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2050
		{ 0x06, 0xef46 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2051
		{ 0x06, 0xdc19 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2052
		{ 0x06, 0xddd0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2053
		{ 0x06, 0x0102 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2054
		{ 0x06, 0x825b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2055
		{ 0x06, 0x0282 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2056
		{ 0x06, 0x77e0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2057
		{ 0x06, 0xf860 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2058
		{ 0x06, 0xe1f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2059
		{ 0x06, 0x6158 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2060
		{ 0x06, 0xfde4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2061
		{ 0x06, 0xf860 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2062
		{ 0x06, 0xe5f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2063
		{ 0x06, 0x61fc },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2064
		{ 0x06, 0x04f9 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2065
		{ 0x06, 0xfafb },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2066
		{ 0x06, 0xc6bf },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2067
		{ 0x06, 0xf840 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2068
		{ 0x06, 0xbe83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2069
		{ 0x06, 0x50a0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2070
		{ 0x06, 0x0101 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2071
		{ 0x06, 0x071b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2072
		{ 0x06, 0x89cf },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2073
		{ 0x06, 0xd208 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2074
		{ 0x06, 0xebdb },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2075
		{ 0x06, 0x19b2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2076
		{ 0x06, 0xfbff },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2077
		{ 0x06, 0xfefd },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2078
		{ 0x06, 0x04f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2079
		{ 0x06, 0xe0f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2080
		{ 0x06, 0x48e1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2081
		{ 0x06, 0xf849 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2082
		{ 0x06, 0x6808 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2083
		{ 0x06, 0xe4f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2084
		{ 0x06, 0x48e5 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2085
		{ 0x06, 0xf849 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2086
		{ 0x06, 0x58f7 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2087
		{ 0x06, 0xe4f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2088
		{ 0x06, 0x48e5 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2089
		{ 0x06, 0xf849 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2090
		{ 0x06, 0xfc04 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2091
		{ 0x06, 0x4d20 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2092
		{ 0x06, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2093
		{ 0x06, 0x4e22 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2094
		{ 0x06, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2095
		{ 0x06, 0x4ddf },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2096
		{ 0x06, 0xff01 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2097
		{ 0x06, 0x4edd },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2098
		{ 0x06, 0xff01 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2099
		{ 0x05, 0x83d4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2100
		{ 0x06, 0x8000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2101
		{ 0x05, 0x83d8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2102
		{ 0x06, 0x8051 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2103
		{ 0x02, 0x6010 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2104
		{ 0x03, 0xdc00 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2105
		{ 0x05, 0xfff6 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2106
		{ 0x06, 0x00fc },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2107
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2108
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2109
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2110
		{ 0x0d, 0xf880 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2111
		{ 0x1f, 0x0000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2112
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2113
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2115
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2116
	mdio_write(ioaddr, 0x1f, 0x0002);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2117
	mdio_plus_minus(ioaddr, 0x0b, 0x0010, 0x00ef);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2118
	mdio_plus_minus(ioaddr, 0x0c, 0xa200, 0x5d00);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2119
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2121
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2122
	if (rtl8168d_efuse_read(ioaddr, 0x01) == 0xb1) {
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2124
			{ 0x1f, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2125
			{ 0x05, 0x669a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2126
			{ 0x1f, 0x0005 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2127
			{ 0x05, 0x8330 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2128
			{ 0x06, 0x669a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2129
			{ 0x1f, 0x0002 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2130
		};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2131
		int val;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2132
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2134
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2135
		val = mdio_read(ioaddr, 0x0d);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2136
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2137
		if ((val & 0x00ff) != 0x006c) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2138
			static const u32 set[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2139
				0x0065, 0x0066, 0x0067, 0x0068,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2140
				0x0069, 0x006a, 0x006b, 0x006c
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2141
			};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2142
			int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2143
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2144
			mdio_write(ioaddr, 0x1f, 0x0002);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2145
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2146
			val &= 0xff00;
4f6670f083f1 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++)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2148
				mdio_write(ioaddr, 0x0d, val | set[i]);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2149
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2150
	} else {
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2152
			{ 0x1f, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2153
			{ 0x05, 0x6662 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2154
			{ 0x1f, 0x0005 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2155
			{ 0x05, 0x8330 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2156
			{ 0x06, 0x6662 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2157
		};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2158
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2160
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2161
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2162
	mdio_write(ioaddr, 0x1f, 0x0002);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2163
	mdio_patch(ioaddr, 0x0d, 0x0300);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2164
	mdio_patch(ioaddr, 0x0f, 0x0010);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2165
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2166
	mdio_write(ioaddr, 0x1f, 0x0002);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2167
	mdio_plus_minus(ioaddr, 0x02, 0x0100, 0x0600);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2168
	mdio_plus_minus(ioaddr, 0x03, 0x0000, 0xe000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2169
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2171
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2172
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2174
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2176
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2177
		{ 0x06, 0x4064 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2178
		{ 0x07, 0x2863 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2179
		{ 0x08, 0x059c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2180
		{ 0x09, 0x26b4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2181
		{ 0x0a, 0x6a19 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2182
		{ 0x0b, 0xdcc8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2183
		{ 0x10, 0xf06d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2184
		{ 0x14, 0x7f68 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2185
		{ 0x18, 0x7fd9 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2186
		{ 0x1c, 0xf0ff },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2187
		{ 0x1d, 0x3d9c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2188
		{ 0x1f, 0x0003 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2189
		{ 0x12, 0xf49f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2190
		{ 0x13, 0x070b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2191
		{ 0x1a, 0x05ad },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2192
		{ 0x14, 0x94c0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2193
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2194
		{ 0x1f, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2195
		{ 0x06, 0x5561 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2196
		{ 0x1f, 0x0005 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2197
		{ 0x05, 0x8332 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2198
		{ 0x06, 0x5561 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2199
	};
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2201
		{ 0x1f, 0x0005 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2202
		{ 0x05, 0xffc2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2203
		{ 0x1f, 0x0005 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2204
		{ 0x05, 0x8000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2205
		{ 0x06, 0xf8f9 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2206
		{ 0x06, 0xfaee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2207
		{ 0x06, 0xf8ea },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2208
		{ 0x06, 0x00ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2209
		{ 0x06, 0xf8eb },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2210
		{ 0x06, 0x00e2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2211
		{ 0x06, 0xf87c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2212
		{ 0x06, 0xe3f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2213
		{ 0x06, 0x7da5 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2214
		{ 0x06, 0x1111 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2215
		{ 0x06, 0x12d2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2216
		{ 0x06, 0x40d6 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2217
		{ 0x06, 0x4444 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2218
		{ 0x06, 0x0281 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2219
		{ 0x06, 0xc6d2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2220
		{ 0x06, 0xa0d6 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2221
		{ 0x06, 0xaaaa },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2222
		{ 0x06, 0x0281 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2223
		{ 0x06, 0xc6ae },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2224
		{ 0x06, 0x0fa5 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2225
		{ 0x06, 0x4444 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2226
		{ 0x06, 0x02ae },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2227
		{ 0x06, 0x4da5 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2228
		{ 0x06, 0xaaaa },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2229
		{ 0x06, 0x02ae },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2230
		{ 0x06, 0x47af },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2231
		{ 0x06, 0x81c2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2232
		{ 0x06, 0xee83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2233
		{ 0x06, 0x4e00 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2234
		{ 0x06, 0xee83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2235
		{ 0x06, 0x4d0f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2236
		{ 0x06, 0xee83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2237
		{ 0x06, 0x4c0f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2238
		{ 0x06, 0xee83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2239
		{ 0x06, 0x4f00 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2240
		{ 0x06, 0xee83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2241
		{ 0x06, 0x5100 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2242
		{ 0x06, 0xee83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2243
		{ 0x06, 0x4aff },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2244
		{ 0x06, 0xee83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2245
		{ 0x06, 0x4bff },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2246
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2247
		{ 0x06, 0x30e1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2248
		{ 0x06, 0x8331 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2249
		{ 0x06, 0x58fe },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2250
		{ 0x06, 0xe4f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2251
		{ 0x06, 0x8ae5 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2252
		{ 0x06, 0xf88b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2253
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2254
		{ 0x06, 0x32e1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2255
		{ 0x06, 0x8333 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2256
		{ 0x06, 0x590f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2257
		{ 0x06, 0xe283 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2258
		{ 0x06, 0x4d0c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2259
		{ 0x06, 0x245a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2260
		{ 0x06, 0xf01e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2261
		{ 0x06, 0x12e4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2262
		{ 0x06, 0xf88c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2263
		{ 0x06, 0xe5f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2264
		{ 0x06, 0x8daf },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2265
		{ 0x06, 0x81c2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2266
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2267
		{ 0x06, 0x4f10 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2268
		{ 0x06, 0xe483 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2269
		{ 0x06, 0x4fe0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2270
		{ 0x06, 0x834e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2271
		{ 0x06, 0x7800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2272
		{ 0x06, 0x9f0a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2273
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2274
		{ 0x06, 0x4fa0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2275
		{ 0x06, 0x10a5 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2276
		{ 0x06, 0xee83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2277
		{ 0x06, 0x4e01 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2278
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2279
		{ 0x06, 0x4e78 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2280
		{ 0x06, 0x059e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2281
		{ 0x06, 0x9ae0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2282
		{ 0x06, 0x834e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2283
		{ 0x06, 0x7804 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2284
		{ 0x06, 0x9e10 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2285
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2286
		{ 0x06, 0x4e78 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2287
		{ 0x06, 0x039e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2288
		{ 0x06, 0x0fe0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2289
		{ 0x06, 0x834e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2290
		{ 0x06, 0x7801 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2291
		{ 0x06, 0x9e05 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2292
		{ 0x06, 0xae0c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2293
		{ 0x06, 0xaf81 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2294
		{ 0x06, 0xa7af },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2295
		{ 0x06, 0x8152 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2296
		{ 0x06, 0xaf81 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2297
		{ 0x06, 0x8baf },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2298
		{ 0x06, 0x81c2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2299
		{ 0x06, 0xee83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2300
		{ 0x06, 0x4800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2301
		{ 0x06, 0xee83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2302
		{ 0x06, 0x4900 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2303
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2304
		{ 0x06, 0x5110 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2305
		{ 0x06, 0xe483 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2306
		{ 0x06, 0x5158 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2307
		{ 0x06, 0x019f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2308
		{ 0x06, 0xead0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2309
		{ 0x06, 0x00d1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2310
		{ 0x06, 0x801f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2311
		{ 0x06, 0x66e2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2312
		{ 0x06, 0xf8ea },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2313
		{ 0x06, 0xe3f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2314
		{ 0x06, 0xeb5a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2315
		{ 0x06, 0xf81e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2316
		{ 0x06, 0x20e6 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2317
		{ 0x06, 0xf8ea },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2318
		{ 0x06, 0xe5f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2319
		{ 0x06, 0xebd3 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2320
		{ 0x06, 0x02b3 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2321
		{ 0x06, 0xfee2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2322
		{ 0x06, 0xf87c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2323
		{ 0x06, 0xef32 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2324
		{ 0x06, 0x5b80 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2325
		{ 0x06, 0xe3f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2326
		{ 0x06, 0x7d9e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2327
		{ 0x06, 0x037d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2328
		{ 0x06, 0xffff },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2329
		{ 0x06, 0x0d58 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2330
		{ 0x06, 0x1c55 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2331
		{ 0x06, 0x1a65 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2332
		{ 0x06, 0x11a1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2333
		{ 0x06, 0x90d3 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2334
		{ 0x06, 0xe283 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2335
		{ 0x06, 0x48e3 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2336
		{ 0x06, 0x8349 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2337
		{ 0x06, 0x1b56 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2338
		{ 0x06, 0xab08 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2339
		{ 0x06, 0xef56 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2340
		{ 0x06, 0xe683 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2341
		{ 0x06, 0x48e7 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2342
		{ 0x06, 0x8349 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2343
		{ 0x06, 0x10d1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2344
		{ 0x06, 0x801f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2345
		{ 0x06, 0x66a0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2346
		{ 0x06, 0x04b9 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2347
		{ 0x06, 0xe283 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2348
		{ 0x06, 0x48e3 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2349
		{ 0x06, 0x8349 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2350
		{ 0x06, 0xef65 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2351
		{ 0x06, 0xe283 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2352
		{ 0x06, 0x4ae3 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2353
		{ 0x06, 0x834b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2354
		{ 0x06, 0x1b56 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2355
		{ 0x06, 0xaa0e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2356
		{ 0x06, 0xef56 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2357
		{ 0x06, 0xe683 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2358
		{ 0x06, 0x4ae7 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2359
		{ 0x06, 0x834b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2360
		{ 0x06, 0xe283 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2361
		{ 0x06, 0x4de6 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2362
		{ 0x06, 0x834c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2363
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2364
		{ 0x06, 0x4da0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2365
		{ 0x06, 0x000c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2366
		{ 0x06, 0xaf81 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2367
		{ 0x06, 0x8be0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2368
		{ 0x06, 0x834d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2369
		{ 0x06, 0x10e4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2370
		{ 0x06, 0x834d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2371
		{ 0x06, 0xae04 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2372
		{ 0x06, 0x80e4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2373
		{ 0x06, 0x834d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2374
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2375
		{ 0x06, 0x4e78 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2376
		{ 0x06, 0x039e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2377
		{ 0x06, 0x0be0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2378
		{ 0x06, 0x834e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2379
		{ 0x06, 0x7804 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2380
		{ 0x06, 0x9e04 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2381
		{ 0x06, 0xee83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2382
		{ 0x06, 0x4e02 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2383
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2384
		{ 0x06, 0x32e1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2385
		{ 0x06, 0x8333 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2386
		{ 0x06, 0x590f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2387
		{ 0x06, 0xe283 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2388
		{ 0x06, 0x4d0c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2389
		{ 0x06, 0x245a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2390
		{ 0x06, 0xf01e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2391
		{ 0x06, 0x12e4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2392
		{ 0x06, 0xf88c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2393
		{ 0x06, 0xe5f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2394
		{ 0x06, 0x8de0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2395
		{ 0x06, 0x8330 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2396
		{ 0x06, 0xe183 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2397
		{ 0x06, 0x3168 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2398
		{ 0x06, 0x01e4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2399
		{ 0x06, 0xf88a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2400
		{ 0x06, 0xe5f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2401
		{ 0x06, 0x8bae },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2402
		{ 0x06, 0x37ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2403
		{ 0x06, 0x834e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2404
		{ 0x06, 0x03e0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2405
		{ 0x06, 0x834c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2406
		{ 0x06, 0xe183 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2407
		{ 0x06, 0x4d1b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2408
		{ 0x06, 0x019e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2409
		{ 0x06, 0x04aa },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2410
		{ 0x06, 0xa1ae },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2411
		{ 0x06, 0xa8ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2412
		{ 0x06, 0x834e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2413
		{ 0x06, 0x04ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2414
		{ 0x06, 0x834f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2415
		{ 0x06, 0x00ae },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2416
		{ 0x06, 0xabe0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2417
		{ 0x06, 0x834f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2418
		{ 0x06, 0x7803 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2419
		{ 0x06, 0x9f14 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2420
		{ 0x06, 0xee83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2421
		{ 0x06, 0x4e05 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2422
		{ 0x06, 0xd240 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2423
		{ 0x06, 0xd655 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2424
		{ 0x06, 0x5402 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2425
		{ 0x06, 0x81c6 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2426
		{ 0x06, 0xd2a0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2427
		{ 0x06, 0xd6ba },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2428
		{ 0x06, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2429
		{ 0x06, 0x81c6 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2430
		{ 0x06, 0xfefd },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2431
		{ 0x06, 0xfc05 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2432
		{ 0x06, 0xf8e0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2433
		{ 0x06, 0xf860 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2434
		{ 0x06, 0xe1f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2435
		{ 0x06, 0x6168 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2436
		{ 0x06, 0x02e4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2437
		{ 0x06, 0xf860 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2438
		{ 0x06, 0xe5f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2439
		{ 0x06, 0x61e0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2440
		{ 0x06, 0xf848 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2441
		{ 0x06, 0xe1f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2442
		{ 0x06, 0x4958 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2443
		{ 0x06, 0x0f1e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2444
		{ 0x06, 0x02e4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2445
		{ 0x06, 0xf848 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2446
		{ 0x06, 0xe5f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2447
		{ 0x06, 0x49d0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2448
		{ 0x06, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2449
		{ 0x06, 0x820a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2450
		{ 0x06, 0xbf83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2451
		{ 0x06, 0x50ef },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2452
		{ 0x06, 0x46dc },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2453
		{ 0x06, 0x19dd },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2454
		{ 0x06, 0xd001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2455
		{ 0x06, 0x0282 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2456
		{ 0x06, 0x0a02 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2457
		{ 0x06, 0x8226 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2458
		{ 0x06, 0xe0f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2459
		{ 0x06, 0x60e1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2460
		{ 0x06, 0xf861 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2461
		{ 0x06, 0x58fd },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2462
		{ 0x06, 0xe4f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2463
		{ 0x06, 0x60e5 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2464
		{ 0x06, 0xf861 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2465
		{ 0x06, 0xfc04 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2466
		{ 0x06, 0xf9fa },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2467
		{ 0x06, 0xfbc6 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2468
		{ 0x06, 0xbff8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2469
		{ 0x06, 0x40be },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2470
		{ 0x06, 0x8350 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2471
		{ 0x06, 0xa001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2472
		{ 0x06, 0x0107 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2473
		{ 0x06, 0x1b89 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2474
		{ 0x06, 0xcfd2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2475
		{ 0x06, 0x08eb },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2476
		{ 0x06, 0xdb19 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2477
		{ 0x06, 0xb2fb },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2478
		{ 0x06, 0xfffe },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2479
		{ 0x06, 0xfd04 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2480
		{ 0x06, 0xf8e0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2481
		{ 0x06, 0xf848 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2482
		{ 0x06, 0xe1f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2483
		{ 0x06, 0x4968 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2484
		{ 0x06, 0x08e4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2485
		{ 0x06, 0xf848 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2486
		{ 0x06, 0xe5f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2487
		{ 0x06, 0x4958 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2488
		{ 0x06, 0xf7e4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2489
		{ 0x06, 0xf848 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2490
		{ 0x06, 0xe5f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2491
		{ 0x06, 0x49fc },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2492
		{ 0x06, 0x044d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2493
		{ 0x06, 0x2000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2494
		{ 0x06, 0x024e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2495
		{ 0x06, 0x2200 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2496
		{ 0x06, 0x024d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2497
		{ 0x06, 0xdfff },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2498
		{ 0x06, 0x014e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2499
		{ 0x06, 0xddff },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2500
		{ 0x06, 0x0100 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2501
		{ 0x05, 0x83d8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2502
		{ 0x06, 0x8000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2503
		{ 0x03, 0xdc00 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2504
		{ 0x05, 0xfff6 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2505
		{ 0x06, 0x00fc },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2506
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2507
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2508
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2509
		{ 0x0d, 0xf880 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2510
		{ 0x1f, 0x0000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2511
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2512
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2514
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2515
	if (rtl8168d_efuse_read(ioaddr, 0x01) == 0xb1) {
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2517
			{ 0x1f, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2518
			{ 0x05, 0x669a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2519
			{ 0x1f, 0x0005 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2520
			{ 0x05, 0x8330 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2521
			{ 0x06, 0x669a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2522
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2523
			{ 0x1f, 0x0002 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2524
		};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2525
		int val;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2526
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2528
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2529
		val = mdio_read(ioaddr, 0x0d);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2530
		if ((val & 0x00ff) != 0x006c) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2531
			u32 set[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2532
				0x0065, 0x0066, 0x0067, 0x0068,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2533
				0x0069, 0x006a, 0x006b, 0x006c
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2534
			};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2535
			int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2536
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2537
			mdio_write(ioaddr, 0x1f, 0x0002);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2538
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2539
			val &= 0xff00;
4f6670f083f1 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++)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2541
				mdio_write(ioaddr, 0x0d, val | set[i]);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2542
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2543
	} else {
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2545
			{ 0x1f, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2546
			{ 0x05, 0x2642 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2547
			{ 0x1f, 0x0005 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2548
			{ 0x05, 0x8330 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2549
			{ 0x06, 0x2642 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2550
		};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2551
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2553
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2554
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2555
	mdio_write(ioaddr, 0x1f, 0x0002);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2556
	mdio_plus_minus(ioaddr, 0x02, 0x0100, 0x0600);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2557
	mdio_plus_minus(ioaddr, 0x03, 0x0000, 0xe000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2558
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2559
	mdio_write(ioaddr, 0x1f, 0x0001);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2560
	mdio_write(ioaddr, 0x17, 0x0cc0);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2561
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2562
	mdio_write(ioaddr, 0x1f, 0x0002);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2563
	mdio_patch(ioaddr, 0x0f, 0x0017);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2564
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2566
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2567
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2569
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2571
		{ 0x1f, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2572
		{ 0x10, 0x0008 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2573
		{ 0x0d, 0x006c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2574
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2575
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2576
		{ 0x0d, 0xf880 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2577
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2578
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2579
		{ 0x17, 0x0cc0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2580
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2581
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2582
		{ 0x0b, 0xa4d8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2583
		{ 0x09, 0x281c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2584
		{ 0x07, 0x2883 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2585
		{ 0x0a, 0x6b35 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2586
		{ 0x1d, 0x3da4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2587
		{ 0x1c, 0xeffd },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2588
		{ 0x14, 0x7f52 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2589
		{ 0x18, 0x7fc6 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2590
		{ 0x08, 0x0601 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2591
		{ 0x06, 0x4063 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2592
		{ 0x10, 0xf074 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2593
		{ 0x1f, 0x0003 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2594
		{ 0x13, 0x0789 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2595
		{ 0x12, 0xf4bd },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2596
		{ 0x1a, 0x04fd },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2597
		{ 0x14, 0x84b0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2598
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2599
		{ 0x00, 0x9200 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2600
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2601
		{ 0x1f, 0x0005 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2602
		{ 0x01, 0x0340 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2603
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2604
		{ 0x04, 0x4000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2605
		{ 0x03, 0x1d21 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2606
		{ 0x02, 0x0c32 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2607
		{ 0x01, 0x0200 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2608
		{ 0x00, 0x5554 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2609
		{ 0x04, 0x4800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2610
		{ 0x04, 0x4000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2611
		{ 0x04, 0xf000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2612
		{ 0x03, 0xdf01 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2613
		{ 0x02, 0xdf20 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2614
		{ 0x01, 0x101a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2615
		{ 0x00, 0xa0ff },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2616
		{ 0x04, 0xf800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2617
		{ 0x04, 0xf000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2618
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2619
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2620
		{ 0x1f, 0x0007 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2621
		{ 0x1e, 0x0023 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2622
		{ 0x16, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2623
		{ 0x1f, 0x0000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2624
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2625
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2627
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2628
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2630
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2632
		{ 0x1f, 0x0003 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2633
		{ 0x08, 0x441d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2634
		{ 0x01, 0x9100 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2635
		{ 0x1f, 0x0000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2636
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2637
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2638
	mdio_write(ioaddr, 0x1f, 0x0000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2639
	mdio_patch(ioaddr, 0x11, 1 << 12);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2640
	mdio_patch(ioaddr, 0x19, 1 << 13);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2641
	mdio_patch(ioaddr, 0x10, 1 << 15);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2642
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2644
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2645
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2647
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2648
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2649
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2650
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2651
	rtl8169_print_mac_version(tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2652
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2653
	switch (tp->mac_version) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2654
	case RTL_GIGA_MAC_VER_01:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2655
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2656
	case RTL_GIGA_MAC_VER_02:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2657
	case RTL_GIGA_MAC_VER_03:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2658
		rtl8169s_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2659
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2660
	case RTL_GIGA_MAC_VER_04:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2661
		rtl8169sb_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2662
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2663
	case RTL_GIGA_MAC_VER_05:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2664
		rtl8169scd_hw_phy_config(tp, ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2665
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2666
	case RTL_GIGA_MAC_VER_06:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2667
		rtl8169sce_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2668
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2669
	case RTL_GIGA_MAC_VER_07:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2670
	case RTL_GIGA_MAC_VER_08:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2671
	case RTL_GIGA_MAC_VER_09:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2672
		rtl8102e_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2673
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2674
	case RTL_GIGA_MAC_VER_11:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2675
		rtl8168bb_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2676
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2677
	case RTL_GIGA_MAC_VER_12:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2678
		rtl8168bef_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2679
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2680
	case RTL_GIGA_MAC_VER_17:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2681
		rtl8168bef_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2682
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2683
	case RTL_GIGA_MAC_VER_18:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2684
		rtl8168cp_1_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2685
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2686
	case RTL_GIGA_MAC_VER_19:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2687
		rtl8168c_1_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2688
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2689
	case RTL_GIGA_MAC_VER_20:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2690
		rtl8168c_2_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2691
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2692
	case RTL_GIGA_MAC_VER_21:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2693
		rtl8168c_3_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2694
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2695
	case RTL_GIGA_MAC_VER_22:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2696
		rtl8168c_4_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2697
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2698
	case RTL_GIGA_MAC_VER_23:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2699
	case RTL_GIGA_MAC_VER_24:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2700
		rtl8168cp_2_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2701
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2702
	case RTL_GIGA_MAC_VER_25:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2703
		rtl8168d_1_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2704
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2705
	case RTL_GIGA_MAC_VER_26:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2706
		rtl8168d_2_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2707
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2708
	case RTL_GIGA_MAC_VER_27:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2709
		rtl8168d_3_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2710
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2711
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2712
	default:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2713
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2714
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2715
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2716
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2718
{
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2720
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2721
	struct timer_list *timer = &tp->timer;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2722
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2723
	unsigned long timeout = RTL8169_PHY_TIMEOUT;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2724
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2726
4f6670f083f1 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))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2728
		return;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2729
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2730
	spin_lock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2731
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2732
	if (tp->phy_reset_pending(ioaddr)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2733
		/*
4f6670f083f1 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.
4f6670f083f1 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.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2736
		 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2737
		timeout = HZ/10;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2738
		goto out_mod_timer;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2739
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2740
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2741
	if (tp->link_ok(ioaddr))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2742
		goto out_unlock;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2743
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2745
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2746
	tp->phy_reset_enable(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2747
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2748
out_mod_timer:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2749
	mod_timer(timer, jiffies + timeout);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2750
out_unlock:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2751
	spin_unlock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2752
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2753
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2755
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2756
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2757
	struct timer_list *timer = &tp->timer;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2758
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2760
		return;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2761
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2762
	del_timer_sync(timer);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2763
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2764
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2766
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2767
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2768
	struct timer_list *timer = &tp->timer;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2769
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2771
		return;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2772
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2773
	mod_timer(timer, jiffies + RTL8169_PHY_TIMEOUT);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2774
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2775
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2776
#ifdef CONFIG_NET_POLL_CONTROLLER
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2777
/*
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2780
 * the interrupt routine is executing.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2781
 */
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2783
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2784
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2785
	struct pci_dev *pdev = tp->pci_dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2786
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2787
	disable_irq(pdev->irq);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2788
	rtl8169_interrupt(pdev->irq, dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2789
	enable_irq(pdev->irq);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2790
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2791
#endif
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2792
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2794
				  void __iomem *ioaddr)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2795
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2796
	iounmap(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2797
	pci_release_regions(pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2798
	pci_clear_mwi(pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2799
	pci_disable_device(pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2800
	free_netdev(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2801
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2802
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2804
			      struct rtl8169_private *tp)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2805
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2806
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2807
	unsigned int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2808
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2809
	tp->phy_reset_enable(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2810
	for (i = 0; i < 100; i++) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2811
		if (!tp->phy_reset_pending(ioaddr))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2812
			return;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2813
		msleep(1);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2814
	}
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2816
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2817
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2819
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2820
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2821
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2822
	rtl_hw_phy_config(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2823
4f6670f083f1 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) {
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2826
		RTL_W8(0x82, 0x01);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2827
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2828
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2830
4f6670f083f1 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)
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2833
4f6670f083f1 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) {
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2836
		RTL_W8(0x82, 0x01);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2837
		dprintk("Set PHY Reg 0x0bh = 0x00h\n");
4f6670f083f1 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
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2839
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2840
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2841
	rtl8169_phy_reset(dev, tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2842
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2843
	/*
4f6670f083f1 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
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2845
	 * only 8101. Don't panic.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2846
	 */
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2848
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2849
	if (RTL_R8(PHYstatus) & TBI_Enable)
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2851
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2852
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2854
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2855
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2856
	u32 high;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2857
	u32 low;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2858
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2860
	high = addr[4] | (addr[5] << 8);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2861
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2862
	spin_lock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2863
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2864
	RTL_W8(Cfg9346, Cfg9346_Unlock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2865
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2866
	RTL_W32(MAC4, high);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2867
	RTL_R32(MAC4);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2868
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2869
	RTL_W32(MAC0, low);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2870
	RTL_R32(MAC0);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2871
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2872
	RTL_W8(Cfg9346, Cfg9346_Lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2873
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2874
	spin_unlock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2875
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2876
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2878
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2879
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2880
	struct sockaddr *addr = p;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2881
4f6670f083f1 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))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2883
		return -EADDRNOTAVAIL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2884
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2886
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2887
	rtl_rar_set(tp, dev->dev_addr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2888
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2889
	return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2890
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2891
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2893
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2894
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2896
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2898
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2899
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2901
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2902
	switch (cmd) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2903
	case SIOCGMIIPHY:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2904
		data->phy_id = 32; /* Internal PHY */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2905
		return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2906
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2907
	case SIOCGMIIREG:
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2909
		return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2910
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2911
	case SIOCSMIIREG:
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2913
		return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2914
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2915
	return -EOPNOTSUPP;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2916
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2917
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2919
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2920
	return -EOPNOTSUPP;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2921
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2922
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2923
static const struct rtl_cfg_info {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2924
	void (*hw_start)(struct net_device *);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2925
	unsigned int region;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2926
	unsigned int align;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2927
	u16 intr_event;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2928
	u16 napi_event;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2929
	unsigned features;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2930
	u8 default_ver;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2931
} rtl_cfg_infos [] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2932
	[RTL_CFG_0] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2933
		.hw_start	= rtl_hw_start_8169,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2934
		.region		= 1,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2935
		.align		= 0,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2936
		.intr_event	= SYSErr | LinkChg | RxOverflow |
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2937
				  RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2938
		.napi_event	= RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2939
		.features	= RTL_FEATURE_GMII,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2940
		.default_ver	= RTL_GIGA_MAC_VER_01,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2941
	},
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2942
	[RTL_CFG_1] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2943
		.hw_start	= rtl_hw_start_8168,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2944
		.region		= 2,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2945
		.align		= 8,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2946
		.intr_event	= SYSErr | LinkChg | RxOverflow |
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2947
				  TxErr | TxOK | RxOK | RxErr,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2948
		.napi_event	= TxErr | TxOK | RxOK | RxOverflow,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2949
		.features	= RTL_FEATURE_GMII | RTL_FEATURE_MSI,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2950
		.default_ver	= RTL_GIGA_MAC_VER_11,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2951
	},
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2952
	[RTL_CFG_2] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2953
		.hw_start	= rtl_hw_start_8101,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2954
		.region		= 2,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2955
		.align		= 8,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2956
		.intr_event	= SYSErr | LinkChg | RxOverflow | PCSTimeout |
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2957
				  RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2958
		.napi_event	= RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2959
		.features	= RTL_FEATURE_MSI,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2960
		.default_ver	= RTL_GIGA_MAC_VER_13,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2961
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2962
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2963
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2964
/* Cfg9346_Unlock assumed. */
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2966
			    const struct rtl_cfg_info *cfg)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2967
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2968
	unsigned msi = 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2969
	u8 cfg2;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2970
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2971
	cfg2 = RTL_R8(Config2) & ~MSIEnable;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2972
	if (cfg->features & RTL_FEATURE_MSI) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2973
		if (pci_enable_msi(pdev)) {
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2975
		} else {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2976
			cfg2 |= MSIEnable;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2977
			msi = RTL_FEATURE_MSI;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2978
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2979
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2980
	RTL_W8(Config2, cfg2);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2981
	return msi;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2982
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2983
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2985
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2986
	if (tp->features & RTL_FEATURE_MSI) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2987
		pci_disable_msi(pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2988
		tp->features &= ~RTL_FEATURE_MSI;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2989
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2990
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2991
4f6670f083f1 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 = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2993
	.ndo_open		= rtl8169_open,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2994
	.ndo_stop		= rtl8169_close,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2995
	.ndo_get_stats		= rtl8169_get_stats,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2996
	.ndo_start_xmit		= rtl8169_start_xmit,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2997
	.ndo_tx_timeout		= rtl8169_tx_timeout,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2998
	.ndo_validate_addr	= eth_validate_addr,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2999
	.ndo_change_mtu		= rtl8169_change_mtu,
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3001
	.ndo_do_ioctl		= rtl8169_ioctl,
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3003
#ifdef CONFIG_R8169_VLAN
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3005
#endif
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3006
#ifdef CONFIG_NET_POLL_CONTROLLER
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3007
	.ndo_poll_controller	= rtl8169_netpoll,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3008
#endif
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3009
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3010
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3011
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3012
static int __devinit
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3014
{
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3016
	const unsigned int region = cfg->region;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3017
	struct rtl8169_private *tp;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3018
	struct mii_if_info *mii;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3019
	struct net_device *dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3020
	void __iomem *ioaddr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3021
	unsigned int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3022
	int rc;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3023
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3024
	if (netif_msg_drv(&debug)) {
4f6670f083f1 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",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3026
		       MODULENAME, RTL8169_VERSION);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3027
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3028
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3029
	dev = alloc_etherdev(sizeof (*tp));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3030
	if (!dev) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3031
		if (netif_msg_drv(&debug))
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3033
		rc = -ENOMEM;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3034
		goto out;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3035
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3036
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3037
	SET_NETDEV_DEV(dev, &pdev->dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3038
	dev->netdev_ops = &rtl8169_netdev_ops;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3039
	tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3040
	tp->dev = dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3041
	tp->pci_dev = pdev;
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3043
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3044
	mii = &tp->mii;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3045
	mii->dev = dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3046
	mii->mdio_read = rtl_mdio_read;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3047
	mii->mdio_write = rtl_mdio_write;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3048
	mii->phy_id_mask = 0x1f;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3049
	mii->reg_num_mask = 0x1f;
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3051
4f6670f083f1 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
4f6670f083f1 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 */
4f6670f083f1 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 |
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3055
				     PCIE_LINK_STATE_CLKPM);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3056
4f6670f083f1 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) */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3058
	rc = pci_enable_device(pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3059
	if (rc < 0) {
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3061
		goto err_out_free_dev_1;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3062
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3063
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3064
	if (pci_set_mwi(pdev) < 0)
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3066
4f6670f083f1 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 */
4f6670f083f1 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)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3069
		netif_err(tp, probe, dev,
4f6670f083f1 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",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3071
			  region);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3072
		rc = -ENODEV;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3073
		goto err_out_mwi_2;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3074
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3075
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3076
	/* check for weird/broken PCI region reporting */
4f6670f083f1 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) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3078
		netif_err(tp, probe, dev,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3079
			  "Invalid PCI region size(s), aborting\n");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3080
		rc = -ENODEV;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3081
		goto err_out_mwi_2;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3082
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3083
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3084
	rc = pci_request_regions(pdev, MODULENAME);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3085
	if (rc < 0) {
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3087
		goto err_out_mwi_2;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3088
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3089
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3090
	tp->cp_cmd = PCIMulRW | RxChkSum;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3091
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3092
	if ((sizeof(dma_addr_t) > 4) &&
4f6670f083f1 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) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3094
		tp->cp_cmd |= PCIDAC;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3095
		dev->features |= NETIF_F_HIGHDMA;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3096
	} else {
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3098
		if (rc < 0) {
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3100
			goto err_out_free_res_3;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3101
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3102
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3103
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3104
	/* ioremap MMIO region */
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3106
	if (!ioaddr) {
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3108
		rc = -EIO;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3109
		goto err_out_free_res_3;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3110
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3111
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3113
	if (!tp->pcie_cap)
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3115
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3116
	RTL_W16(IntrMask, 0x0000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3117
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3118
	/* Soft reset the chip. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3119
	RTL_W8(ChipCmd, CmdReset);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3120
4f6670f083f1 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. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3122
	for (i = 0; i < 100; i++) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3123
		if ((RTL_R8(ChipCmd) & CmdReset) == 0)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3124
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3125
		msleep_interruptible(1);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3126
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3127
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3128
	RTL_W16(IntrStatus, 0xffff);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3129
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3130
	pci_set_master(pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3131
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3132
	/* Identify chip attached to board */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3133
	rtl8169_get_mac_version(tp, ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3134
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3135
	/* Use appropriate default if unknown */
4f6670f083f1 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) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3137
		netif_notice(tp, probe, dev,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3138
			     "unknown MAC, using family default\n");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3139
		tp->mac_version = cfg->default_ver;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3140
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3141
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3142
	rtl8169_print_mac_version(tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3143
4f6670f083f1 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++) {
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3146
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3147
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3148
	if (i == ARRAY_SIZE(rtl_chip_info)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3149
		dev_err(&pdev->dev,
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3151
		goto err_out_msi_4;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3152
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3153
	tp->chipset = i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3154
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3155
	RTL_W8(Cfg9346, Cfg9346_Unlock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3156
	RTL_W8(Config1, RTL_R8(Config1) | PMEnable);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3157
	RTL_W8(Config5, RTL_R8(Config5) & PMEStatus);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3158
	if ((RTL_R8(Config3) & (LinkUp | MagicPacket)) != 0)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3159
		tp->features |= RTL_FEATURE_WOL;
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3161
		tp->features |= RTL_FEATURE_WOL;
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3163
	RTL_W8(Cfg9346, Cfg9346_Lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3164
4f6670f083f1 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) &&
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3166
	    (RTL_R8(PHYstatus) & TBI_Enable)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3167
		tp->set_speed = rtl8169_set_speed_tbi;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3168
		tp->get_settings = rtl8169_gset_tbi;
4f6670f083f1 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;
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3171
		tp->link_ok = rtl8169_tbi_link_ok;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3172
		tp->do_ioctl = rtl_tbi_ioctl;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3173
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3175
	} else {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3176
		tp->set_speed = rtl8169_set_speed_xmii;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3177
		tp->get_settings = rtl8169_gset_xmii;
4f6670f083f1 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;
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3180
		tp->link_ok = rtl8169_xmii_link_ok;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3181
		tp->do_ioctl = rtl_xmii_ioctl;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3182
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3183
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3184
	spin_lock_init(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3185
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3186
	tp->mmio_addr = ioaddr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3187
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3188
	/* Get MAC address */
4f6670f083f1 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++)
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3192
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3193
	SET_ETHTOOL_OPS(dev, &rtl8169_ethtool_ops);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3194
	dev->watchdog_timeo = RTL8169_TX_TIMEOUT;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3195
	dev->irq = pdev->irq;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3196
	dev->base_addr = (unsigned long) ioaddr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3197
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3199
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3200
#ifdef CONFIG_R8169_VLAN
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3202
#endif
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3203
	dev->features |= NETIF_F_GRO;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3204
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3205
	tp->intr_mask = 0xffff;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3206
	tp->hw_start = cfg->hw_start;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3207
	tp->intr_event = cfg->intr_event;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3208
	tp->napi_event = cfg->napi_event;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3209
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3210
	init_timer(&tp->timer);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3211
	tp->timer.data = (unsigned long) dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3212
	tp->timer.function = rtl8169_phy_timer;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3213
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3214
	rc = register_netdev(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3215
	if (rc < 0)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3216
		goto err_out_msi_4;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3217
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3218
	pci_set_drvdata(pdev, dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3219
4f6670f083f1 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",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3221
		   rtl_chip_info[tp->chipset].name,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3222
		   dev->base_addr, dev->dev_addr,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3223
		   (u32)(RTL_R32(TxConfig) & 0x9cf0f8ff), dev->irq);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3224
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3225
	rtl8169_init_phy(dev, tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3226
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3227
	/*
4f6670f083f1 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
4f6670f083f1 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.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3230
	 */
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3232
		RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) | RxVlan);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3233
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3235
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3236
	if (pci_dev_run_wake(pdev))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3237
		pm_runtime_put_noidle(&pdev->dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3238
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3239
	netif_carrier_off(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3240
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3241
out:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3242
	return rc;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3243
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3244
err_out_msi_4:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3245
	rtl_disable_msi(pdev, tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3246
	iounmap(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3247
err_out_free_res_3:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3248
	pci_release_regions(pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3249
err_out_mwi_2:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3250
	pci_clear_mwi(pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3251
	pci_disable_device(pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3252
err_out_free_dev_1:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3253
	free_netdev(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3254
	goto out;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3255
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3256
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3258
{
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3260
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3261
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3262
	flush_scheduled_work();
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3263
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3264
	unregister_netdev(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3265
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3266
	if (pci_dev_run_wake(pdev))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3267
		pm_runtime_get_noresume(&pdev->dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3268
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3269
	/* restore original MAC address */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3270
	rtl_rar_set(tp, dev->perm_addr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3271
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3272
	rtl_disable_msi(pdev, tp);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3274
	pci_set_drvdata(pdev, NULL);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3275
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3276
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3278
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3279
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3280
	struct pci_dev *pdev = tp->pci_dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3281
	int retval = -ENOMEM;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3282
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3283
	pm_runtime_get_sync(&pdev->dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3284
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3285
	/*
4f6670f083f1 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.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3287
	 * dma_alloc_coherent provides more.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3288
	 */
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3290
					     &tp->TxPhyAddr, GFP_KERNEL);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3291
	if (!tp->TxDescArray)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3292
		goto err_pm_runtime_put;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3293
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3295
					     &tp->RxPhyAddr, GFP_KERNEL);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3296
	if (!tp->RxDescArray)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3297
		goto err_free_tx_0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3298
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3299
	retval = rtl8169_init_ring(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3300
	if (retval < 0)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3301
		goto err_free_rx_1;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3302
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3303
	INIT_DELAYED_WORK(&tp->task, NULL);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3304
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3305
	smp_mb();
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3306
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3307
	retval = request_irq(dev->irq, rtl8169_interrupt,
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3309
			     dev->name, dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3310
	if (retval < 0)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3311
		goto err_release_ring_2;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3312
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3313
	napi_enable(&tp->napi);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3314
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3315
	rtl_hw_start(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3316
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3317
	rtl8169_request_timer(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3318
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3319
	tp->saved_wolopts = 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3320
	pm_runtime_put_noidle(&pdev->dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3321
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3323
out:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3324
	return retval;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3325
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3326
err_release_ring_2:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3327
	rtl8169_rx_clear(tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3328
err_free_rx_1:
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3330
			  tp->RxPhyAddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3331
	tp->RxDescArray = NULL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3332
err_free_tx_0:
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3334
			  tp->TxPhyAddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3335
	tp->TxDescArray = NULL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3336
err_pm_runtime_put:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3337
	pm_runtime_put_noidle(&pdev->dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3338
	goto out;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3339
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3340
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3342
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3343
	/* Disable interrupts */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3344
	rtl8169_irq_mask_and_ack(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3345
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3346
	/* Reset the chipset */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3347
	RTL_W8(ChipCmd, CmdReset);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3348
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3349
	/* PCI commit */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3350
	RTL_R8(ChipCmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3351
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3352
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3354
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3355
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3356
	u32 cfg = rtl8169_rx_config;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3357
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3359
	RTL_W32(RxConfig, cfg);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3360
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3362
	RTL_W32(TxConfig, (TX_DMA_BURST << TxDMAShift) |
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3363
		(InterFrameGap << TxInterFrameGapShift));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3364
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3365
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3367
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3368
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3369
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3370
	unsigned int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3371
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3372
	/* Soft reset the chip. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3373
	RTL_W8(ChipCmd, CmdReset);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3374
4f6670f083f1 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. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3376
	for (i = 0; i < 100; i++) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3377
		if ((RTL_R8(ChipCmd) & CmdReset) == 0)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3378
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3379
		msleep_interruptible(1);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3380
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3381
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3382
	tp->hw_start(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3383
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3384
	netif_start_queue(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3385
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3386
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3387
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3389
					 void __iomem *ioaddr)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3390
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3391
	/*
4f6670f083f1 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
4f6670f083f1 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.
4f6670f083f1 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.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3395
	 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3396
	RTL_W32(TxDescStartAddrHigh, ((u64) tp->TxPhyAddr) >> 32);
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3398
	RTL_W32(RxDescAddrHigh, ((u64) tp->RxPhyAddr) >> 32);
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3400
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3401
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3403
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3404
	u16 cmd;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3405
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3406
	cmd = RTL_R16(CPlusCmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3407
	RTL_W16(CPlusCmd, cmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3408
	return cmd;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3409
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3410
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3412
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3413
	/* Low hurts. Let's disable the filtering. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3414
	RTL_W16(RxMaxSize, rx_buf_sz + 1);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3415
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3416
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3418
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3419
	static const struct {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3420
		u32 mac_version;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3421
		u32 clk;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3422
		u32 val;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3423
	} cfg2_info [] = {
4f6670f083f1 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
4f6670f083f1 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 },
4f6670f083f1 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
4f6670f083f1 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 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3428
	}, *p = cfg2_info;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3429
	unsigned int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3430
	u32 clk;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3431
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3432
	clk = RTL_R8(Config2) & PCI_Clock_66MHz;
4f6670f083f1 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++) {
4f6670f083f1 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)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3435
			RTL_W32(0x7c, p->val);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3436
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3437
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3438
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3439
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3440
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3442
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3443
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3444
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3445
	struct pci_dev *pdev = tp->pci_dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3446
4f6670f083f1 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) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3448
		RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) | PCIMulRW);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3450
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3451
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3452
	RTL_W8(Cfg9346, Cfg9346_Unlock);
4f6670f083f1 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) ||
4f6670f083f1 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) ||
4f6670f083f1 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) ||
4f6670f083f1 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))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3457
		RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3458
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3459
	RTL_W8(EarlyTxThres, EarlyTxThld);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3460
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3462
4f6670f083f1 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) ||
4f6670f083f1 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) ||
4f6670f083f1 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) ||
4f6670f083f1 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))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3467
		rtl_set_rx_tx_config_registers(tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3468
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3470
4f6670f083f1 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) ||
4f6670f083f1 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)) {
4f6670f083f1 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. "
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3475
		tp->cp_cmd |= (1 << 14);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3476
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3477
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3478
	RTL_W16(CPlusCmd, tp->cp_cmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3479
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3481
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3482
	/*
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3483
	 * Undocumented corner. Supposedly:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3484
	 * (TxTimer << 12) | (TxPackets << 8) | (RxTimer << 4) | RxPackets
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3485
	 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3486
	RTL_W16(IntrMitigate, 0x0000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3487
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3489
4f6670f083f1 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) &&
4f6670f083f1 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) &&
4f6670f083f1 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) &&
4f6670f083f1 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)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3494
		RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3495
		rtl_set_rx_tx_config_registers(tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3496
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3497
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3498
	RTL_W8(Cfg9346, Cfg9346_Lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3499
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3501
	RTL_R8(IntrMask);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3502
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3503
	RTL_W32(RxMissed, 0);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3504
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3505
	rtl_set_rx_mode(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3506
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3507
	/* no early-rx interrupts */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3508
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xF000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3509
4f6670f083f1 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. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3511
	RTL_W16(IntrMask, tp->intr_event);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3512
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3513
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3515
{
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3517
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3518
	int cap = tp->pcie_cap;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3519
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3520
	if (cap) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3521
		u16 ctl;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3522
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3524
		ctl = (ctl & ~PCI_EXP_DEVCTL_READRQ) | force;
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3526
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3527
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3528
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3530
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3531
	u32 csi;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3532
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3533
	csi = rtl_csi_read(ioaddr, 0x070c) & 0x00ffffff;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3534
	rtl_csi_write(ioaddr, 0x070c, csi | 0x27000000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3535
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3536
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3537
struct ephy_info {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3538
	unsigned int offset;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3539
	u16 mask;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3540
	u16 bits;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3541
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3542
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3544
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3545
	u16 w;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3546
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3547
	while (len-- > 0) {
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3549
		rtl_ephy_write(ioaddr, e->offset, w);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3550
		e++;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3551
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3552
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3553
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3555
{
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3557
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3558
	int cap = tp->pcie_cap;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3559
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3560
	if (cap) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3561
		u16 ctl;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3562
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3564
		ctl &= ~PCI_EXP_LNKCTL_CLKREQ_EN;
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3566
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3567
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3568
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3569
#define R8168_CPCMD_QUIRK_MASK (\
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3570
	EnableBist | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3571
	Mac_dbgo_oe | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3572
	Force_half_dup | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3573
	Force_rxflow_en | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3574
	Force_txflow_en | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3575
	Cxpl_dbg_sel | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3576
	ASF | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3577
	PktCntrDisable | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3578
	Mac_dbgo_sel)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3579
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3581
{
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3583
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3585
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3586
	rtl_tx_performance_tweak(pdev,
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3588
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3589
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3591
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3592
	rtl_hw_start_8168bb(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3593
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3594
	RTL_W8(EarlyTxThres, EarlyTxThld);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3595
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3597
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3598
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3600
{
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3602
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3604
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3606
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3607
	rtl_disable_clock_request(pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3608
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3610
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3611
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3613
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3615
		{ 0x01, 0,	0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3616
		{ 0x02, 0x0800,	0x1000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3617
		{ 0x03, 0,	0x0042 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3618
		{ 0x06, 0x0080,	0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3619
		{ 0x07, 0,	0x2000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3620
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3621
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3622
	rtl_csi_access_enable(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3623
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3625
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3626
	__rtl_hw_start_8168cp(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3627
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3628
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3630
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3631
	rtl_csi_access_enable(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3632
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3634
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3636
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3638
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3639
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3641
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3642
	rtl_csi_access_enable(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3643
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3645
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3646
	/* Magic. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3647
	RTL_W8(DBG_REG, 0x20);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3648
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3649
	RTL_W8(EarlyTxThres, EarlyTxThld);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3650
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3652
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3654
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3655
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3657
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3659
		{ 0x02, 0x0800,	0x1000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3660
		{ 0x03, 0,	0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3661
		{ 0x06, 0x0080,	0x0000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3662
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3663
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3664
	rtl_csi_access_enable(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3665
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3667
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3669
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3670
	__rtl_hw_start_8168cp(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3671
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3672
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3674
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3676
		{ 0x01, 0,	0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3677
		{ 0x03, 0x0400,	0x0220 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3678
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3679
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3680
	rtl_csi_access_enable(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3681
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3683
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3684
	__rtl_hw_start_8168cp(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3685
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3686
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3688
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3689
	rtl_hw_start_8168c_2(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3690
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3691
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3693
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3694
	rtl_csi_access_enable(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3695
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3696
	__rtl_hw_start_8168cp(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3697
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3698
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3700
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3701
	rtl_csi_access_enable(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3702
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3703
	rtl_disable_clock_request(pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3704
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3705
	RTL_W8(EarlyTxThres, EarlyTxThld);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3706
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3708
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3710
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3711
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3713
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3714
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3715
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3716
	struct pci_dev *pdev = tp->pci_dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3717
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3718
	RTL_W8(Cfg9346, Cfg9346_Unlock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3719
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3720
	RTL_W8(EarlyTxThres, EarlyTxThld);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3721
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3723
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3725
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3726
	RTL_W16(CPlusCmd, tp->cp_cmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3727
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3728
	RTL_W16(IntrMitigate, 0x5151);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3729
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3730
	/* Work around for RxFIFO overflow. */
4f6670f083f1 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 ||
4f6670f083f1 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) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3733
		tp->intr_event |= RxFIFOOver | PCSTimeout;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3734
		tp->intr_event &= ~RxOverflow;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3735
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3736
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3738
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3739
	rtl_set_rx_mode(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3740
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3741
	RTL_W32(TxConfig, (TX_DMA_BURST << TxDMAShift) |
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3742
		(InterFrameGap << TxInterFrameGapShift));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3743
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3744
	RTL_R8(IntrMask);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3745
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3746
	switch (tp->mac_version) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3747
	case RTL_GIGA_MAC_VER_11:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3748
		rtl_hw_start_8168bb(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3749
	break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3750
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3751
	case RTL_GIGA_MAC_VER_12:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3752
	case RTL_GIGA_MAC_VER_17:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3753
		rtl_hw_start_8168bef(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3754
	break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3755
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3756
	case RTL_GIGA_MAC_VER_18:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3757
		rtl_hw_start_8168cp_1(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3758
	break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3759
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3760
	case RTL_GIGA_MAC_VER_19:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3761
		rtl_hw_start_8168c_1(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3762
	break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3763
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3764
	case RTL_GIGA_MAC_VER_20:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3765
		rtl_hw_start_8168c_2(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3766
	break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3767
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3768
	case RTL_GIGA_MAC_VER_21:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3769
		rtl_hw_start_8168c_3(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3770
	break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3771
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3772
	case RTL_GIGA_MAC_VER_22:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3773
		rtl_hw_start_8168c_4(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3774
	break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3775
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3776
	case RTL_GIGA_MAC_VER_23:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3777
		rtl_hw_start_8168cp_2(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3778
	break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3779
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3780
	case RTL_GIGA_MAC_VER_24:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3781
		rtl_hw_start_8168cp_3(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3782
	break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3783
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3784
	case RTL_GIGA_MAC_VER_25:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3785
	case RTL_GIGA_MAC_VER_26:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3786
	case RTL_GIGA_MAC_VER_27:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3787
		rtl_hw_start_8168d(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3788
	break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3789
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3790
	default:
4f6670f083f1 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",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3792
			dev->name, tp->mac_version);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3793
	break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3794
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3795
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3796
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3797
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3798
	RTL_W8(Cfg9346, Cfg9346_Lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3799
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3800
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xF000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3801
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3802
	RTL_W16(IntrMask, tp->intr_event);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3803
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3804
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3805
#define R810X_CPCMD_QUIRK_MASK (\
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3806
	EnableBist | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3807
	Mac_dbgo_oe | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3808
	Force_half_dup | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3809
	Force_rxflow_en | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3810
	Force_txflow_en | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3811
	Cxpl_dbg_sel | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3812
	ASF | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3813
	PktCntrDisable | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3814
	PCIDAC | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3815
	PCIMulRW)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3816
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3818
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3820
		{ 0x01,	0, 0x6e65 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3821
		{ 0x02,	0, 0x091f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3822
		{ 0x03,	0, 0xc2f9 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3823
		{ 0x06,	0, 0xafb5 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3824
		{ 0x07,	0, 0x0e00 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3825
		{ 0x19,	0, 0xec80 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3826
		{ 0x01,	0, 0x2e65 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3827
		{ 0x01,	0, 0x6e65 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3828
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3829
	u8 cfg1;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3830
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3831
	rtl_csi_access_enable(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3832
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3833
	RTL_W8(DBG_REG, FIX_NAK_1);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3834
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3836
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3837
	RTL_W8(Config1,
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3840
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3841
	cfg1 = RTL_R8(Config1);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3842
	if ((cfg1 & LEDS0) && (cfg1 & LEDS1))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3843
		RTL_W8(Config1, cfg1 & ~LEDS0);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3844
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3846
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3848
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3849
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3851
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3852
	rtl_csi_access_enable(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3853
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3855
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3856
	RTL_W8(Config1, MEMMAP | IOMAP | VPD | PMEnable);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3858
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3860
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3861
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3863
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3864
	rtl_hw_start_8102e_2(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3865
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3866
	rtl_ephy_write(ioaddr, 0x03, 0xc2f9);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3867
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3868
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3870
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3871
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3872
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3873
	struct pci_dev *pdev = tp->pci_dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3874
4f6670f083f1 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) ||
4f6670f083f1 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)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3877
		int cap = tp->pcie_cap;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3878
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3879
		if (cap) {
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3881
					      PCI_EXP_DEVCTL_NOSNOOP_EN);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3882
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3883
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3884
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3885
	switch (tp->mac_version) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3886
	case RTL_GIGA_MAC_VER_07:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3887
		rtl_hw_start_8102e_1(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3888
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3889
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3890
	case RTL_GIGA_MAC_VER_08:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3891
		rtl_hw_start_8102e_3(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3892
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3893
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3894
	case RTL_GIGA_MAC_VER_09:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3895
		rtl_hw_start_8102e_2(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3896
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3897
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3898
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3899
	RTL_W8(Cfg9346, Cfg9346_Unlock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3900
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3901
	RTL_W8(EarlyTxThres, EarlyTxThld);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3902
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3904
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3906
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3907
	RTL_W16(CPlusCmd, tp->cp_cmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3908
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3909
	RTL_W16(IntrMitigate, 0x0000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3910
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3912
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3913
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3914
	rtl_set_rx_tx_config_registers(tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3915
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3916
	RTL_W8(Cfg9346, Cfg9346_Lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3917
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3918
	RTL_R8(IntrMask);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3919
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3920
	rtl_set_rx_mode(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3921
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3922
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3923
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3924
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xf000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3925
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3926
	RTL_W16(IntrMask, tp->intr_event);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3927
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3928
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3930
{
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3932
		return -EINVAL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3933
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3934
	dev->mtu = new_mtu;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3935
	return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3936
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3937
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3939
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3940
	desc->addr = cpu_to_le64(0x0badbadbadbadbadull);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3941
	desc->opts1 &= ~cpu_to_le32(DescOwn | RsvdMask);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3942
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3943
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3945
				     void **data_buff, struct RxDesc *desc)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3946
{
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3948
			 DMA_FROM_DEVICE);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3949
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3950
	kfree(*data_buff);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3951
	*data_buff = NULL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3952
	rtl8169_make_unusable_by_asic(desc);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3953
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3954
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3956
{
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3958
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3960
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3961
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3963
				       u32 rx_buf_sz)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3964
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3965
	desc->addr = cpu_to_le64(mapping);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3966
	wmb();
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3968
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3969
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3970
static inline void *rtl8169_align(void *data)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3971
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3972
	return (void *)ALIGN((long)data, 16);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3973
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3974
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3976
					     struct RxDesc *desc)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3977
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3978
	void *data;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3979
	dma_addr_t mapping;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3980
	struct device *d = &tp->pci_dev->dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3981
	struct net_device *dev = tp->dev;
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3983
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3985
	if (!data)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3986
		return NULL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3987
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3988
	if (rtl8169_align(data) != data) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3989
		kfree(data);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3991
		if (!data)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3992
			return NULL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3993
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3994
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3996
				 DMA_FROM_DEVICE);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3997
	if (unlikely(dma_mapping_error(d, mapping))) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3998
		if (net_ratelimit())
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4000
		goto err_out;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4001
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4002
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4004
	return data;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4005
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4006
err_out:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4007
	kfree(data);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4008
	return NULL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4009
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4010
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4012
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4013
	unsigned int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4014
4f6670f083f1 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++) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4016
		if (tp->Rx_databuff[i]) {
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4018
					    tp->RxDescArray + i);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4019
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4020
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4021
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4022
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4024
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4025
	desc->opts1 |= cpu_to_le32(RingEnd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4026
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4027
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4029
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4030
	unsigned int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4031
4f6670f083f1 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++) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4033
		void *data;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4034
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4035
		if (tp->Rx_databuff[i])
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4036
			continue;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4037
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4039
		if (!data) {
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4041
			goto err_out;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4042
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4043
		tp->Rx_databuff[i] = data;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4044
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4045
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4047
	return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4048
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4049
err_out:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4050
	rtl8169_rx_clear(tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4051
	return -ENOMEM;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4052
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4053
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4055
{
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4057
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4058
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4060
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4061
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4062
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4063
	rtl8169_init_ring_indexes(tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4064
4f6670f083f1 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));
4f6670f083f1 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 *));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4067
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4068
	return rtl8169_rx_fill(tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4069
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4070
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4072
				 struct TxDesc *desc)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4073
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4074
	unsigned int len = tx_skb->len;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4075
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4077
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4078
	desc->opts1 = 0x00;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4079
	desc->opts2 = 0x00;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4080
	desc->addr = 0x00;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4081
	tx_skb->len = 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4082
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4083
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4085
				   unsigned int n)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4086
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4087
	unsigned int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4088
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4089
	for (i = 0; i < n; i++) {
4f6670f083f1 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;
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4092
		unsigned int len = tx_skb->len;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4093
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4094
		if (len) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4095
			struct sk_buff *skb = tx_skb->skb;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4096
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4098
					     tp->TxDescArray + entry);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4099
			if (skb) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4100
				tp->dev->stats.tx_dropped++;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4101
				dev_kfree_skb(skb);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4102
				tx_skb->skb = NULL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4103
			}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4104
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4105
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4106
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4107
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4109
{
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4111
	tp->cur_tx = tp->dirty_tx = 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4112
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4113
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4115
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4116
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4117
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4118
	PREPARE_DELAYED_WORK(&tp->task, task);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4119
	schedule_delayed_work(&tp->task, 4);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4120
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4121
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4123
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4124
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4125
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4126
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4127
	synchronize_irq(dev->irq);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4128
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4130
	napi_disable(&tp->napi);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4131
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4132
	rtl8169_irq_mask_and_ack(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4133
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4134
	tp->intr_mask = 0xffff;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4135
	RTL_W16(IntrMask, tp->intr_event);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4136
	napi_enable(&tp->napi);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4137
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4138
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4140
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4141
	struct rtl8169_private *tp =
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4143
	struct net_device *dev = tp->dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4144
	int ret;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4145
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4146
	rtnl_lock();
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4147
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4148
	if (!netif_running(dev))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4149
		goto out_unlock;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4150
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4151
	rtl8169_wait_for_quiescence(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4152
	rtl8169_close(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4153
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4154
	ret = rtl8169_open(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4155
	if (unlikely(ret < 0)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4156
		if (net_ratelimit())
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4157
			netif_err(tp, drv, dev,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4158
				  "reinit failure (status = %d). Rescheduling\n",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4159
				  ret);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4160
		rtl8169_schedule_work(dev, rtl8169_reinit_task);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4161
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4162
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4163
out_unlock:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4164
	rtnl_unlock();
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4165
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4166
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4168
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4169
	struct rtl8169_private *tp =
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4171
	struct net_device *dev = tp->dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4172
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4173
	rtnl_lock();
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4174
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4175
	if (!netif_running(dev))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4176
		goto out_unlock;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4177
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4178
	rtl8169_wait_for_quiescence(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4179
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4181
	rtl8169_tx_clear(tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4182
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4183
	if (tp->dirty_rx == tp->cur_rx) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4184
		rtl8169_init_ring_indexes(tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4185
		rtl_hw_start(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4186
		netif_wake_queue(dev);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4188
	} else {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4189
		if (net_ratelimit())
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4191
		rtl8169_schedule_work(dev, rtl8169_reset_task);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4192
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4193
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4194
out_unlock:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4195
	rtnl_unlock();
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4196
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4197
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4199
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4200
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4201
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4202
	rtl8169_hw_reset(tp->mmio_addr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4203
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4205
	rtl8169_schedule_work(dev, rtl8169_reset_task);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4206
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4207
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4209
			      u32 opts1)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4210
{
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4212
	unsigned int cur_frag, entry;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4213
	struct TxDesc * uninitialized_var(txd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4214
	struct device *d = &tp->pci_dev->dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4215
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4216
	entry = tp->cur_tx;
4f6670f083f1 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++) {
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4219
		dma_addr_t mapping;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4220
		u32 status, len;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4221
		void *addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4222
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4223
		entry = (entry + 1) % NUM_TX_DESC;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4224
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4225
		txd = tp->TxDescArray + entry;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4226
		len = frag->size;
4f6670f083f1 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;
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4229
		if (unlikely(dma_mapping_error(d, mapping))) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4230
			if (net_ratelimit())
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4231
				netif_err(tp, drv, tp->dev,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4232
					  "Failed to map TX fragments DMA!\n");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4233
			goto err_out;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4234
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4235
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4236
		/* anti gcc 2.95.3 bugware (sic) */
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4238
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4239
		txd->opts1 = cpu_to_le32(status);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4240
		txd->addr = cpu_to_le64(mapping);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4241
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4242
		tp->tx_skb[entry].len = len;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4243
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4244
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4245
	if (cur_frag) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4246
		tp->tx_skb[entry].skb = skb;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4247
		txd->opts1 |= cpu_to_le32(LastFrag);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4248
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4249
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4250
	return cur_frag;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4251
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4252
err_out:
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4254
	return -EIO;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4255
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4256
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4258
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4259
	if (dev->features & NETIF_F_TSO) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4260
		u32 mss = skb_shinfo(skb)->gso_size;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4261
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4262
		if (mss)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4263
			return LargeSend | ((mss & MSSMask) << MSSShift);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4264
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4265
	if (skb->ip_summed == CHECKSUM_PARTIAL) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4266
		const struct iphdr *ip = ip_hdr(skb);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4267
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4268
		if (ip->protocol == IPPROTO_TCP)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4269
			return IPCS | TCPCS;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4270
		else if (ip->protocol == IPPROTO_UDP)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4271
			return IPCS | UDPCS;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4272
		WARN_ON(1);	/* we need a WARN() */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4273
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4274
	return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4275
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4276
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4278
				      struct net_device *dev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4279
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4280
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4282
	struct TxDesc *txd = tp->TxDescArray + entry;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4283
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4284
	struct device *d = &tp->pci_dev->dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4285
	dma_addr_t mapping;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4286
	u32 status, len;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4287
	u32 opts1;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4288
	int frags;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4289
4f6670f083f1 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)) {
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4292
		goto err_stop_0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4293
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4294
4f6670f083f1 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))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4296
		goto err_stop_0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4297
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4298
	len = skb_headlen(skb);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4300
	if (unlikely(dma_mapping_error(d, mapping))) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4301
		if (net_ratelimit())
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4303
		goto err_dma_0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4304
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4305
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4306
	tp->tx_skb[entry].len = len;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4307
	txd->addr = cpu_to_le64(mapping);
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4309
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4310
	opts1 = DescOwn | rtl8169_tso_csum(skb, dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4311
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4312
	frags = rtl8169_xmit_frags(tp, skb, opts1);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4313
	if (frags < 0)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4314
		goto err_dma_1;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4315
	else if (frags)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4316
		opts1 |= FirstFrag;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4317
	else {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4318
		opts1 |= FirstFrag | LastFrag;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4319
		tp->tx_skb[entry].skb = skb;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4320
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4321
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4322
	wmb();
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4323
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4324
	/* anti gcc 2.95.3 bugware (sic) */
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4326
	txd->opts1 = cpu_to_le32(status);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4327
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4328
	tp->cur_tx += frags + 1;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4329
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4330
	wmb();
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4331
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4332
	RTL_W8(TxPoll, NPQ);	/* set polling bit */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4333
4f6670f083f1 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) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4335
		netif_stop_queue(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4336
		smp_rmb();
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4338
			netif_wake_queue(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4339
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4340
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4341
	return NETDEV_TX_OK;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4342
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4343
err_dma_1:
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4345
err_dma_0:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4346
	dev_kfree_skb(skb);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4347
	dev->stats.tx_dropped++;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4348
	return NETDEV_TX_OK;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4349
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4350
err_stop_0:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4351
	netif_stop_queue(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4352
	dev->stats.tx_dropped++;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4353
	return NETDEV_TX_BUSY;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4354
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4355
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4357
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4358
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4359
	struct pci_dev *pdev = tp->pci_dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4360
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4361
	u16 pci_status, pci_cmd;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4362
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4365
4f6670f083f1 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",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4367
		  pci_cmd, pci_status);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4368
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4369
	/*
4f6670f083f1 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:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4371
	 * - it seems to work;
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4373
	 * - it makes iop3xx happy.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4374
	 *
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4375
	 * Feel free to adjust to your needs.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4376
	 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4377
	if (pdev->broken_parity_status)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4378
		pci_cmd &= ~PCI_COMMAND_PARITY;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4379
	else
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4381
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4383
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4384
	pci_write_config_word(pdev, PCI_STATUS,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4385
		pci_status & (PCI_STATUS_DETECTED_PARITY |
4f6670f083f1 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 |
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4388
4f6670f083f1 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 */
4f6670f083f1 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) {
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4392
		tp->cp_cmd &= ~PCIDAC;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4393
		RTL_W16(CPlusCmd, tp->cp_cmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4394
		dev->features &= ~NETIF_F_HIGHDMA;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4395
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4396
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4397
	rtl8169_hw_reset(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4398
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4399
	rtl8169_schedule_work(dev, rtl8169_reinit_task);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4400
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4401
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4403
				 struct rtl8169_private *tp,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4404
				 void __iomem *ioaddr)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4405
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4406
	unsigned int dirty_tx, tx_left;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4407
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4408
	dirty_tx = tp->dirty_tx;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4409
	smp_rmb();
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4410
	tx_left = tp->cur_tx - dirty_tx;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4411
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4412
	while (tx_left > 0) {
4f6670f083f1 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;
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4415
		u32 status;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4416
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4417
		rmb();
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4419
		if (status & DescOwn)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4420
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4421
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4423
				     tp->TxDescArray + entry);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4424
		if (status & LastFrag) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4425
			dev->stats.tx_packets++;
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4427
			dev_kfree_skb(tx_skb->skb);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4428
			tx_skb->skb = NULL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4429
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4430
		dirty_tx++;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4431
		tx_left--;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4432
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4433
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4434
	if (tp->dirty_tx != dirty_tx) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4435
		tp->dirty_tx = dirty_tx;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4436
		smp_wmb();
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4437
		if (netif_queue_stopped(dev) &&
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4438
		    (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4439
			netif_wake_queue(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4440
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4441
		/*
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4445
		 * it is slow enough). -- FR
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4446
		 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4447
		smp_rmb();
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4448
		if (tp->cur_tx != dirty_tx)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4449
			RTL_W8(TxPoll, NPQ);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4450
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4451
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4452
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4454
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4455
	return (status & (FirstFrag | LastFrag)) != (FirstFrag | LastFrag);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4456
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4457
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4459
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4460
	u32 status = opts1 & RxProtoMask;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4461
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4462
	if (((status == RxProtoTCP) && !(opts1 & TCPFail)) ||
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4463
	    ((status == RxProtoUDP) && !(opts1 & UDPFail)))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4464
		skb->ip_summed = CHECKSUM_UNNECESSARY;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4465
	else
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4466
		skb_checksum_none_assert(skb);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4467
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4468
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4470
					   struct rtl8169_private *tp,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4471
					   int pkt_size,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4472
					   dma_addr_t addr)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4473
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4474
	struct sk_buff *skb;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4475
	struct device *d = &tp->pci_dev->dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4476
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4477
	data = rtl8169_align(data);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4479
	prefetch(data);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4481
	if (skb)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4482
		memcpy(skb->data, data, pkt_size);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4484
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4485
	return skb;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4486
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4487
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4488
/*
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4489
 * Warning : rtl8169_rx_interrupt() might be called :
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4490
 * 1) from NAPI (softirq) context
4f6670f083f1 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())
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4492
 * 2) from process context (rtl8169_reset_task())
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4494
 */
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4496
				struct rtl8169_private *tp,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4497
				void __iomem *ioaddr, u32 budget)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4498
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4499
	unsigned int cur_rx, rx_left;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4500
	unsigned int count;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4501
	int polling = (budget != ~(u32)0) ? 1 : 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4502
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4503
	cur_rx = tp->cur_rx;
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4505
	rx_left = min(rx_left, budget);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4506
4f6670f083f1 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++) {
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4509
		struct RxDesc *desc = tp->RxDescArray + entry;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4510
		u32 status;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4511
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4512
		rmb();
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4513
		status = le32_to_cpu(desc->opts1);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4514
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4515
		if (status & DescOwn)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4516
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4517
		if (unlikely(status & RxRES)) {
4f6670f083f1 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",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4519
				   status);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4520
			dev->stats.rx_errors++;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4521
			if (status & (RxRWT | RxRUNT))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4522
				dev->stats.rx_length_errors++;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4523
			if (status & RxCRC)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4524
				dev->stats.rx_crc_errors++;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4525
			if (status & RxFOVF) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4526
				rtl8169_schedule_work(dev, rtl8169_reset_task);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4527
				dev->stats.rx_fifo_errors++;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4528
			}
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4530
		} else {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4531
			struct sk_buff *skb;
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4533
			int pkt_size = (status & 0x00001FFF) - 4;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4534
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4535
			/*
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4536
			 * The driver does not support incoming fragmented
4f6670f083f1 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
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4538
			 * sized frames.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4539
			 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4540
			if (unlikely(rtl8169_fragmented_frame(status))) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4541
				dev->stats.rx_dropped++;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4542
				dev->stats.rx_length_errors++;
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4544
				continue;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4545
			}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4546
4f6670f083f1 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],
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4548
						  tp, pkt_size, addr);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4550
			if (!skb) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4551
				dev->stats.rx_dropped++;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4552
				continue;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4553
			}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4554
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4555
			rtl8169_rx_csum(skb, status);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4556
			skb_put(skb, pkt_size);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4557
			skb->protocol = eth_type_trans(skb, dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4558
4f6670f083f1 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) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4560
				if (likely(polling))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4561
					napi_gro_receive(&tp->napi, skb);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4562
				else
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4563
					netif_rx(skb);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4564
			}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4565
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4566
			dev->stats.rx_bytes += pkt_size;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4567
			dev->stats.rx_packets++;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4568
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4569
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4570
		/* Work around for AMD plateform. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4571
		if ((desc->opts2 & cpu_to_le32(0xfffe000)) &&
4f6670f083f1 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)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4573
			desc->opts2 = 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4574
			cur_rx++;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4575
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4576
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4577
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4578
	count = cur_rx - tp->cur_rx;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4579
	tp->cur_rx = cur_rx;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4580
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4581
	tp->dirty_rx += count;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4582
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4583
	return count;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4584
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4585
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4587
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4588
	struct net_device *dev = dev_instance;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4589
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4590
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4591
	int handled = 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4592
	int status;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4593
4f6670f083f1 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
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4595
	 * we hit a invalid/hotplug case.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4596
	 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4597
	status = RTL_R16(IntrStatus);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4598
	while (status && status != 0xffff) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4599
		handled = 1;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4600
4f6670f083f1 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
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4602
		 * the chip, so just exit the loop.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4603
		 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4604
		if (unlikely(!netif_running(dev))) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4605
			rtl8169_asic_down(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4606
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4607
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4608
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4609
		if (unlikely(status & RxFIFOOver)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4610
			switch (tp->mac_version) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4611
			/* Work around for rx fifo overflow */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4612
			case RTL_GIGA_MAC_VER_11:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4613
			case RTL_GIGA_MAC_VER_22:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4614
			case RTL_GIGA_MAC_VER_26:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4615
				netif_stop_queue(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4616
				rtl8169_tx_timeout(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4617
				goto done;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4618
			/* Testers needed. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4619
			case RTL_GIGA_MAC_VER_17:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4620
			case RTL_GIGA_MAC_VER_19:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4621
			case RTL_GIGA_MAC_VER_20:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4622
			case RTL_GIGA_MAC_VER_21:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4623
			case RTL_GIGA_MAC_VER_23:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4624
			case RTL_GIGA_MAC_VER_24:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4625
			case RTL_GIGA_MAC_VER_27:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4626
			/* Experimental science. Pktgen proof. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4627
			case RTL_GIGA_MAC_VER_12:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4628
			case RTL_GIGA_MAC_VER_25:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4629
				if (status == RxFIFOOver)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4630
					goto done;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4631
				break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4632
			default:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4633
				break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4634
			}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4635
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4636
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4637
		if (unlikely(status & SYSErr)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4638
			rtl8169_pcierr_interrupt(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4639
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4640
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4641
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4642
		if (status & LinkChg)
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4644
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4647
		 * another event which may never come.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4648
		 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4649
		smp_rmb();
4f6670f083f1 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) {
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4652
			tp->intr_mask = ~tp->napi_event;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4653
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4654
			if (likely(napi_schedule_prep(&tp->napi)))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4655
				__napi_schedule(&tp->napi);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4656
			else
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4657
				netif_info(tp, intr, dev,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4658
					   "interrupt %04x in poll\n", status);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4659
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4660
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4665
		 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4666
		RTL_W16(IntrStatus,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4667
			(status & RxFIFOOver) ? (status | RxOverflow) : status);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4668
		status = RTL_R16(IntrStatus);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4669
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4670
done:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4671
	return IRQ_RETVAL(handled);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4672
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4673
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4675
{
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4677
	struct net_device *dev = tp->dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4678
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4679
	int work_done;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4680
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4682
	rtl8169_tx_interrupt(dev, tp, ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4683
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4684
	if (work_done < budget) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4685
		napi_complete(napi);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4686
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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.
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4692
		 * until it does.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4693
		 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4694
		tp->intr_mask = 0xffff;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4695
		wmb();
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4696
		RTL_W16(IntrMask, tp->intr_event);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4697
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4698
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4699
	return work_done;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4700
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4701
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4703
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4704
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4705
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4707
		return;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4708
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4710
	RTL_W32(RxMissed, 0);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4711
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4712
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4714
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4715
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4716
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4717
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4718
	rtl8169_delete_timer(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4719
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4720
	netif_stop_queue(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4721
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4722
	napi_disable(&tp->napi);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4723
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4724
	spin_lock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4725
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4726
	rtl8169_asic_down(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4727
	/*
4f6670f083f1 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,
4f6670f083f1 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,
4f6670f083f1 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).
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4731
	 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4732
	rtl8169_rx_missed(dev, ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4733
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4734
	spin_unlock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4735
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4736
	synchronize_irq(dev->irq);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4737
4f6670f083f1 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. */
4f6670f083f1 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()? */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4740
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4741
	rtl8169_tx_clear(tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4742
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4743
	rtl8169_rx_clear(tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4744
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4745
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4747
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4748
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4749
	struct pci_dev *pdev = tp->pci_dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4750
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4751
	pm_runtime_get_sync(&pdev->dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4752
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4753
	/* update counters before going down */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4754
	rtl8169_update_counters(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4755
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4756
	rtl8169_down(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4757
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4758
	free_irq(dev->irq, dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4759
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4761
			  tp->RxPhyAddr);
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4763
			  tp->TxPhyAddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4764
	tp->TxDescArray = NULL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4765
	tp->RxDescArray = NULL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4766
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4767
	pm_runtime_put_sync(&pdev->dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4768
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4769
	return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4770
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4771
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4773
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4774
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4775
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4776
	unsigned long flags;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4777
	u32 mc_filter[2];	/* Multicast hash filter */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4778
	int rx_mode;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4779
	u32 tmp = 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4780
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4781
	if (dev->flags & IFF_PROMISC) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4782
		/* Unconditionally log net taps. */
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4784
		rx_mode =
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4785
		    AcceptBroadcast | AcceptMulticast | AcceptMyPhys |
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4786
		    AcceptAllPhys;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4787
		mc_filter[1] = mc_filter[0] = 0xffffffff;
4f6670f083f1 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) ||
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4789
		   (dev->flags & IFF_ALLMULTI)) {
4f6670f083f1 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. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4791
		rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4792
		mc_filter[1] = mc_filter[0] = 0xffffffff;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4793
	} else {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4794
		struct netdev_hw_addr *ha;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4795
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4796
		rx_mode = AcceptBroadcast | AcceptMyPhys;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4797
		mc_filter[1] = mc_filter[0] = 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4798
		netdev_for_each_mc_addr(ha, dev) {
4f6670f083f1 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;
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4801
			rx_mode |= AcceptMulticast;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4802
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4803
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4804
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4805
	spin_lock_irqsave(&tp->lock, flags);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4806
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4807
	tmp = rtl8169_rx_config | rx_mode |
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4809
4f6670f083f1 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) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4811
		u32 data = mc_filter[0];
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4812
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4813
		mc_filter[0] = swab32(mc_filter[1]);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4814
		mc_filter[1] = swab32(data);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4815
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4816
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4817
	RTL_W32(MAR0 + 4, mc_filter[1]);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4818
	RTL_W32(MAR0 + 0, mc_filter[0]);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4819
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4820
	RTL_W32(RxConfig, tmp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4821
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4822
	spin_unlock_irqrestore(&tp->lock, flags);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4823
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4824
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4825
/**
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4828
 *
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4829
 *  Get TX/RX statistics for rtl8169
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4830
 */
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4832
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4833
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4834
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4835
	unsigned long flags;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4836
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4837
	if (netif_running(dev)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4838
		spin_lock_irqsave(&tp->lock, flags);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4839
		rtl8169_rx_missed(dev, ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4840
		spin_unlock_irqrestore(&tp->lock, flags);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4841
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4842
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4843
	return &dev->stats;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4844
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4845
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4847
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4848
	if (!netif_running(dev))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4849
		return;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4850
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4851
	netif_device_detach(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4852
	netif_stop_queue(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4853
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4854
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4855
#ifdef CONFIG_PM
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4856
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4857
static int rtl8169_suspend(struct device *device)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4858
{
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4861
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4862
	rtl8169_net_suspend(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4863
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4864
	return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4865
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4866
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4868
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4869
	netif_device_attach(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4870
	rtl8169_schedule_work(dev, rtl8169_reset_task);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4871
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4872
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4873
static int rtl8169_resume(struct device *device)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4874
{
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4877
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4878
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4879
	rtl8169_init_phy(dev, tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4880
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4881
	if (netif_running(dev))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4882
		__rtl8169_resume(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4883
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4884
	return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4885
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4886
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4888
{
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4891
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4892
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4893
	if (!tp->TxDescArray)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4894
		return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4895
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4896
	spin_lock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4897
	tp->saved_wolopts = __rtl8169_get_wol(tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4898
	__rtl8169_set_wol(tp, WAKE_ANY);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4899
	spin_unlock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4900
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4901
	rtl8169_net_suspend(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4902
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4903
	return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4904
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4905
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4907
{
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4910
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4911
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4912
	if (!tp->TxDescArray)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4913
		return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4914
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4915
	spin_lock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4916
	__rtl8169_set_wol(tp, tp->saved_wolopts);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4917
	tp->saved_wolopts = 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4918
	spin_unlock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4919
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4920
	rtl8169_init_phy(dev, tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4921
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4922
	__rtl8169_resume(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4923
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4924
	return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4925
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4926
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4928
{
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4931
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4932
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4933
	return tp->TxDescArray ? -EBUSY : 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4934
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4935
4f6670f083f1 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 = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4937
	.suspend = rtl8169_suspend,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4938
	.resume = rtl8169_resume,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4939
	.freeze = rtl8169_suspend,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4940
	.thaw = rtl8169_resume,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4941
	.poweroff = rtl8169_suspend,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4942
	.restore = rtl8169_resume,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4943
	.runtime_suspend = rtl8169_runtime_suspend,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4944
	.runtime_resume = rtl8169_runtime_resume,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4945
	.runtime_idle = rtl8169_runtime_idle,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4946
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4947
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4948
#define RTL8169_PM_OPS	(&rtl8169_pm_ops)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4949
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4950
#else /* !CONFIG_PM */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4951
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4952
#define RTL8169_PM_OPS	NULL
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4953
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4954
#endif /* !CONFIG_PM */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4955
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4957
{
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4959
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4960
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4961
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4962
	rtl8169_net_suspend(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4963
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4964
	/* restore original MAC address */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4965
	rtl_rar_set(tp, dev->perm_addr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4966
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4967
	spin_lock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4968
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4969
	rtl8169_asic_down(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4970
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4971
	spin_unlock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4972
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4973
	if (system_state == SYSTEM_POWER_OFF) {
4f6670f083f1 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. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4975
		if (tp->features & RTL_FEATURE_WOL) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4976
			pci_clear_master(pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4977
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4978
			RTL_W8(ChipCmd, CmdRxEnb);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4979
			/* PCI commit */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4980
			RTL_R8(ChipCmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4981
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4982
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4983
		pci_wake_from_d3(pdev, true);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4984
		pci_set_power_state(pdev, PCI_D3hot);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4985
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4986
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4987
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4988
static struct pci_driver rtl8169_pci_driver = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4989
	.name		= MODULENAME,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4990
	.id_table	= rtl8169_pci_tbl,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4991
	.probe		= rtl8169_init_one,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4992
	.remove		= __devexit_p(rtl8169_remove_one),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4993
	.shutdown	= rtl_shutdown,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4994
	.driver.pm	= RTL8169_PM_OPS,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4995
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4996
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4997
static int __init rtl8169_init_module(void)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4998
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4999
	return pci_register_driver(&rtl8169_pci_driver);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5000
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5001
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5002
static void __exit rtl8169_cleanup_module(void)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5003
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5004
	pci_unregister_driver(&rtl8169_pci_driver);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5005
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5006
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5007
module_init(rtl8169_init_module);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5008
module_exit(rtl8169_cleanup_module);