devices/r8169-2.6.37-ethercat.c
author Gavin Lambert <gavinl@compacsort.com>
Tue, 14 Apr 2015 09:33:24 -0400
changeset 2618 3affe9cd0b66
parent 2589 2b9c78543663
permissions -rw-r--r--
Ignore NXIO error otherwise this causes spam if network is empty or refclk not
selected yet, and syncing refclk time to master.
2186
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
 * r8169.c: RealTek 8169/8168/8101 ethernet driver.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
 *
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     4
 * Copyright (c) 2002 ShuChen <shuchen@realtek.com.tw>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     5
 * Copyright (c) 2003 - 2007 Francois Romieu <romieu@fr.zoreil.com>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     6
 * Copyright (c) a lot of people too. Please respect their work.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     7
 *
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     8
 * See MAINTAINERS file for support contact information.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     9
 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    10
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    11
#include <linux/module.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    12
#include <linux/moduleparam.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    13
#include <linux/pci.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    14
#include <linux/netdevice.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    15
#include <linux/etherdevice.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    16
#include <linux/delay.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    17
#include <linux/ethtool.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    18
#include <linux/mii.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    19
#include <linux/if_vlan.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
#include <linux/crc32.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
#include <linux/in.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    22
#include <linux/ip.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    23
#include <linux/tcp.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    24
#include <linux/init.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    25
#include <linux/dma-mapping.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    26
#include <linux/pm_runtime.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    27
#include <linux/pci-aspm.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
#include <asm/system.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
#include <asm/io.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
#include <asm/irq.h>
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
#include "../globals.h"
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
#include "ecdev.h"
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
#define RTL8169_VERSION "2.3LK-NAPI"
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
#define MODULENAME "ec_r8169"
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    37
#define PFX MODULENAME ": "
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    38
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
#ifdef RTL8169_DEBUG
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
#define assert(expr) \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
	if (!(expr)) {					\
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
		printk( "Assertion failed! %s,%s,%s,line=%d\n",	\
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
		#expr,__FILE__,__func__,__LINE__);		\
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
#define dprintk(fmt, args...) \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    46
	do { printk(KERN_DEBUG PFX fmt, ## args); } while (0)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    47
#else
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    48
#define assert(expr) do {} while (0)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    49
#define dprintk(fmt, args...)	do {} while (0)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    50
#endif /* RTL8169_DEBUG */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    51
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
#define R8169_MSG_DEFAULT \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    53
	(NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_IFUP | NETIF_MSG_IFDOWN)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    54
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    55
#define TX_BUFFS_AVAIL(tp) \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    56
	(tp->dirty_tx + NUM_TX_DESC - tp->cur_tx - 1)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    57
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    58
/* Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
   The RTL chips use a 64 element hash table based on the Ethernet CRC. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
static const int multicast_filter_limit = 32;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
/* MAC address length */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    63
#define MAC_ADDR_LEN	6
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    64
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    65
#define MAX_READ_REQUEST_SHIFT	12
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    66
#define RX_FIFO_THRESH	7	/* 7 means NO threshold, Rx buffer level before first PCI xfer. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    67
#define RX_DMA_BURST	6	/* Maximum PCI burst, '6' is 1024 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    68
#define TX_DMA_BURST	6	/* Maximum PCI burst, '6' is 1024 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    69
#define EarlyTxThld	0x3F	/* 0x3F means NO early transmit */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
#define SafeMtu		0x1c20	/* ... actually life sucks beyond ~7k */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    71
#define InterFrameGap	0x03	/* 3 means InterFrameGap = the shortest one */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    73
#define R8169_REGS_SIZE		256
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    74
#define R8169_NAPI_WEIGHT	64
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    75
#define NUM_TX_DESC	64	/* Number of Tx descriptor registers */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    76
#define NUM_RX_DESC	256	/* Number of Rx descriptor registers */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    77
#define RX_BUF_SIZE	1536	/* Rx Buffer size */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
#define R8169_TX_RING_BYTES	(NUM_TX_DESC * sizeof(struct TxDesc))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
#define R8169_RX_RING_BYTES	(NUM_RX_DESC * sizeof(struct RxDesc))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    80
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    81
#define RTL8169_TX_TIMEOUT	(6*HZ)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    82
#define RTL8169_PHY_TIMEOUT	(10*HZ)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    83
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    84
#define RTL_EEPROM_SIG		cpu_to_le32(0x8129)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    85
#define RTL_EEPROM_SIG_MASK	cpu_to_le32(0xffff)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
#define RTL_EEPROM_SIG_ADDR	0x0000
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    87
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    88
/* write/read MMIO register */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
#define RTL_W8(reg, val8)	writeb ((val8), ioaddr + (reg))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    90
#define RTL_W16(reg, val16)	writew ((val16), ioaddr + (reg))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    91
#define RTL_W32(reg, val32)	writel ((val32), ioaddr + (reg))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
#define RTL_R8(reg)		readb (ioaddr + (reg))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    93
#define RTL_R16(reg)		readw (ioaddr + (reg))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    94
#define RTL_R32(reg)		readl (ioaddr + (reg))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    95
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
enum mac_version {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    97
	RTL_GIGA_MAC_NONE   = 0x00,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    98
	RTL_GIGA_MAC_VER_01 = 0x01, // 8169
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    99
	RTL_GIGA_MAC_VER_02 = 0x02, // 8169S
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   100
	RTL_GIGA_MAC_VER_03 = 0x03, // 8110S
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   101
	RTL_GIGA_MAC_VER_04 = 0x04, // 8169SB
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   102
	RTL_GIGA_MAC_VER_05 = 0x05, // 8110SCd
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   103
	RTL_GIGA_MAC_VER_06 = 0x06, // 8110SCe
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   104
	RTL_GIGA_MAC_VER_07 = 0x07, // 8102e
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   105
	RTL_GIGA_MAC_VER_08 = 0x08, // 8102e
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   106
	RTL_GIGA_MAC_VER_09 = 0x09, // 8102e
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   107
	RTL_GIGA_MAC_VER_10 = 0x0a, // 8101e
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   108
	RTL_GIGA_MAC_VER_11 = 0x0b, // 8168Bb
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   109
	RTL_GIGA_MAC_VER_12 = 0x0c, // 8168Be
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   110
	RTL_GIGA_MAC_VER_13 = 0x0d, // 8101Eb
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   111
	RTL_GIGA_MAC_VER_14 = 0x0e, // 8101 ?
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   112
	RTL_GIGA_MAC_VER_15 = 0x0f, // 8101 ?
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   113
	RTL_GIGA_MAC_VER_16 = 0x11, // 8101Ec
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   114
	RTL_GIGA_MAC_VER_17 = 0x10, // 8168Bf
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   115
	RTL_GIGA_MAC_VER_18 = 0x12, // 8168CP
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
	RTL_GIGA_MAC_VER_19 = 0x13, // 8168C
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
	RTL_GIGA_MAC_VER_20 = 0x14, // 8168C
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   118
	RTL_GIGA_MAC_VER_21 = 0x15, // 8168C
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
	RTL_GIGA_MAC_VER_22 = 0x16, // 8168C
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
	RTL_GIGA_MAC_VER_23 = 0x17, // 8168CP
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   121
	RTL_GIGA_MAC_VER_24 = 0x18, // 8168CP
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
	RTL_GIGA_MAC_VER_25 = 0x19, // 8168D
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   123
	RTL_GIGA_MAC_VER_26 = 0x1a, // 8168D
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   124
	RTL_GIGA_MAC_VER_27 = 0x1b  // 8168DP
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   126
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   127
#define _R(NAME,MAC,MASK) \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   128
	{ .name = NAME, .mac_version = MAC, .RxConfigMask = MASK }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   129
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   130
static const struct {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   131
	const char *name;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   132
	u8 mac_version;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   133
	u32 RxConfigMask;	/* Clears the bits supported by this chip */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   134
} rtl_chip_info[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   135
	_R("RTL8169",		RTL_GIGA_MAC_VER_01, 0xff7e1880), // 8169
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   136
	_R("RTL8169s",		RTL_GIGA_MAC_VER_02, 0xff7e1880), // 8169S
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   137
	_R("RTL8110s",		RTL_GIGA_MAC_VER_03, 0xff7e1880), // 8110S
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   138
	_R("RTL8169sb/8110sb",	RTL_GIGA_MAC_VER_04, 0xff7e1880), // 8169SB
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   139
	_R("RTL8169sc/8110sc",	RTL_GIGA_MAC_VER_05, 0xff7e1880), // 8110SCd
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   140
	_R("RTL8169sc/8110sc",	RTL_GIGA_MAC_VER_06, 0xff7e1880), // 8110SCe
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   141
	_R("RTL8102e",		RTL_GIGA_MAC_VER_07, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   142
	_R("RTL8102e",		RTL_GIGA_MAC_VER_08, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   143
	_R("RTL8102e",		RTL_GIGA_MAC_VER_09, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   144
	_R("RTL8101e",		RTL_GIGA_MAC_VER_10, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   145
	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_11, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   146
	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_12, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   147
	_R("RTL8101e",		RTL_GIGA_MAC_VER_13, 0xff7e1880), // PCI-E 8139
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   148
	_R("RTL8100e",		RTL_GIGA_MAC_VER_14, 0xff7e1880), // PCI-E 8139
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   149
	_R("RTL8100e",		RTL_GIGA_MAC_VER_15, 0xff7e1880), // PCI-E 8139
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   150
	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_17, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   151
	_R("RTL8101e",		RTL_GIGA_MAC_VER_16, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   152
	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_18, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   153
	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_19, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   154
	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_20, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   155
	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_21, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   156
	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_22, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   157
	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_23, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   158
	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_24, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   159
	_R("RTL8168d/8111d",	RTL_GIGA_MAC_VER_25, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   160
	_R("RTL8168d/8111d",	RTL_GIGA_MAC_VER_26, 0xff7e1880), // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   161
	_R("RTL8168dp/8111dp",	RTL_GIGA_MAC_VER_27, 0xff7e1880)  // PCI-E
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   162
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   163
#undef _R
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   164
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   165
enum cfg_version {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
	RTL_CFG_0 = 0x00,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   167
	RTL_CFG_1,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
	RTL_CFG_2
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   169
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   170
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   171
static void rtl_hw_start_8169(struct net_device *);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   172
static void rtl_hw_start_8168(struct net_device *);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   173
static void rtl_hw_start_8101(struct net_device *);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   174
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   175
static DEFINE_PCI_DEVICE_TABLE(rtl8169_pci_tbl) = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   176
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8129), 0, 0, RTL_CFG_0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   177
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8136), 0, 0, RTL_CFG_2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   178
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8167), 0, 0, RTL_CFG_0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   179
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8168), 0, 0, RTL_CFG_1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   180
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8169), 0, 0, RTL_CFG_0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   181
	{ PCI_DEVICE(PCI_VENDOR_ID_DLINK,	0x4300), 0, 0, RTL_CFG_0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   182
	{ PCI_DEVICE(PCI_VENDOR_ID_AT,		0xc107), 0, 0, RTL_CFG_0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   183
	{ PCI_DEVICE(0x16ec,			0x0116), 0, 0, RTL_CFG_0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   184
	{ PCI_VENDOR_ID_LINKSYS,		0x1032,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   185
		PCI_ANY_ID, 0x0024, 0, 0, RTL_CFG_0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
	{ 0x0001,				0x8168,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   187
		PCI_ANY_ID, 0x2410, 0, 0, RTL_CFG_2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   188
	{0,},
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   189
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   190
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   191
/* prevent driver from being loaded automatically */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   192
//MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   194
static int rx_buf_sz = 16383;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   195
static int use_dac;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
static struct {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
	u32 msg_enable;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   198
} debug = { -1 };
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   200
enum rtl_registers {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   201
	MAC0		= 0,	/* Ethernet hardware address. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   202
	MAC4		= 4,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   203
	MAR0		= 8,	/* Multicast filter. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   204
	CounterAddrLow		= 0x10,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   205
	CounterAddrHigh		= 0x14,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   206
	TxDescStartAddrLow	= 0x20,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   207
	TxDescStartAddrHigh	= 0x24,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   208
	TxHDescStartAddrLow	= 0x28,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   209
	TxHDescStartAddrHigh	= 0x2c,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   210
	FLASH		= 0x30,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   211
	ERSR		= 0x36,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   212
	ChipCmd		= 0x37,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   213
	TxPoll		= 0x38,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   214
	IntrMask	= 0x3c,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   215
	IntrStatus	= 0x3e,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   216
	TxConfig	= 0x40,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   217
	RxConfig	= 0x44,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   218
	RxMissed	= 0x4c,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   219
	Cfg9346		= 0x50,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   220
	Config0		= 0x51,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   221
	Config1		= 0x52,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   222
	Config2		= 0x53,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   223
	Config3		= 0x54,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   224
	Config4		= 0x55,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   225
	Config5		= 0x56,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   226
	MultiIntr	= 0x5c,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   227
	PHYAR		= 0x60,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   228
	PHYstatus	= 0x6c,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   229
	RxMaxSize	= 0xda,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   230
	CPlusCmd	= 0xe0,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   231
	IntrMitigate	= 0xe2,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   232
	RxDescAddrLow	= 0xe4,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   233
	RxDescAddrHigh	= 0xe8,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   234
	EarlyTxThres	= 0xec,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   235
	FuncEvent	= 0xf0,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   236
	FuncEventMask	= 0xf4,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   237
	FuncPresetState	= 0xf8,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   238
	FuncForceEvent	= 0xfc,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   239
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   240
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   241
enum rtl8110_registers {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   242
	TBICSR			= 0x64,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   243
	TBI_ANAR		= 0x68,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   244
	TBI_LPAR		= 0x6a,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   245
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   246
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   247
enum rtl8168_8101_registers {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   248
	CSIDR			= 0x64,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
	CSIAR			= 0x68,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   250
#define	CSIAR_FLAG			0x80000000
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   251
#define	CSIAR_WRITE_CMD			0x80000000
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   252
#define	CSIAR_BYTE_ENABLE		0x0f
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   253
#define	CSIAR_BYTE_ENABLE_SHIFT		12
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   254
#define	CSIAR_ADDR_MASK			0x0fff
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   255
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   256
	EPHYAR			= 0x80,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   257
#define	EPHYAR_FLAG			0x80000000
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   258
#define	EPHYAR_WRITE_CMD		0x80000000
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   259
#define	EPHYAR_REG_MASK			0x1f
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   260
#define	EPHYAR_REG_SHIFT		16
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
#define	EPHYAR_DATA_MASK		0xffff
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
	DBG_REG			= 0xd1,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
#define	FIX_NAK_1			(1 << 4)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   264
#define	FIX_NAK_2			(1 << 3)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   265
	EFUSEAR			= 0xdc,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   266
#define	EFUSEAR_FLAG			0x80000000
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   267
#define	EFUSEAR_WRITE_CMD		0x80000000
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   268
#define	EFUSEAR_READ_CMD		0x00000000
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   269
#define	EFUSEAR_REG_MASK		0x03ff
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   270
#define	EFUSEAR_REG_SHIFT		8
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   271
#define	EFUSEAR_DATA_MASK		0xff
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   272
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   273
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
enum rtl_register_content {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   275
	/* InterruptStatusBits */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   276
	SYSErr		= 0x8000,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
	PCSTimeout	= 0x4000,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
	SWInt		= 0x0100,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
	TxDescUnavail	= 0x0080,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   280
	RxFIFOOver	= 0x0040,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   281
	LinkChg		= 0x0020,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   282
	RxOverflow	= 0x0010,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   283
	TxErr		= 0x0008,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   284
	TxOK		= 0x0004,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   285
	RxErr		= 0x0002,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   286
	RxOK		= 0x0001,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   287
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   288
	/* RxStatusDesc */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   289
	RxFOVF	= (1 << 23),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   290
	RxRWT	= (1 << 22),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   291
	RxRES	= (1 << 21),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   292
	RxRUNT	= (1 << 20),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   293
	RxCRC	= (1 << 19),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   294
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   295
	/* ChipCmdBits */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   296
	CmdReset	= 0x10,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   297
	CmdRxEnb	= 0x08,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   298
	CmdTxEnb	= 0x04,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   299
	RxBufEmpty	= 0x01,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   300
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   301
	/* TXPoll register p.5 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   302
	HPQ		= 0x80,		/* Poll cmd on the high prio queue */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   303
	NPQ		= 0x40,		/* Poll cmd on the low prio queue */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   304
	FSWInt		= 0x01,		/* Forced software interrupt */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   305
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   306
	/* Cfg9346Bits */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   307
	Cfg9346_Lock	= 0x00,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   308
	Cfg9346_Unlock	= 0xc0,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   309
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   310
	/* rx_mode_bits */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   311
	AcceptErr	= 0x20,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   312
	AcceptRunt	= 0x10,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   313
	AcceptBroadcast	= 0x08,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   314
	AcceptMulticast	= 0x04,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   315
	AcceptMyPhys	= 0x02,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   316
	AcceptAllPhys	= 0x01,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   317
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   318
	/* RxConfigBits */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   319
	RxCfgFIFOShift	= 13,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   320
	RxCfgDMAShift	=  8,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   321
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   322
	/* TxConfigBits */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   323
	TxInterFrameGapShift = 24,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   324
	TxDMAShift = 8,	/* DMA burst value (0-7) is shift this many bits */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   325
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   326
	/* Config1 register p.24 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   327
	LEDS1		= (1 << 7),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   328
	LEDS0		= (1 << 6),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   329
	MSIEnable	= (1 << 5),	/* Enable Message Signaled Interrupt */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   330
	Speed_down	= (1 << 4),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   331
	MEMMAP		= (1 << 3),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   332
	IOMAP		= (1 << 2),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   333
	VPD		= (1 << 1),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   334
	PMEnable	= (1 << 0),	/* Power Management Enable */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   335
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   336
	/* Config2 register p. 25 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   337
	PCI_Clock_66MHz = 0x01,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   338
	PCI_Clock_33MHz = 0x00,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   339
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   340
	/* Config3 register p.25 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   341
	MagicPacket	= (1 << 5),	/* Wake up when receives a Magic Packet */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   342
	LinkUp		= (1 << 4),	/* Wake up when the cable connection is re-established */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   343
	Beacon_en	= (1 << 0),	/* 8168 only. Reserved in the 8168b */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   344
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   345
	/* Config5 register p.27 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   346
	BWF		= (1 << 6),	/* Accept Broadcast wakeup frame */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   347
	MWF		= (1 << 5),	/* Accept Multicast wakeup frame */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   348
	UWF		= (1 << 4),	/* Accept Unicast wakeup frame */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   349
	LanWake		= (1 << 1),	/* LanWake enable/disable */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   350
	PMEStatus	= (1 << 0),	/* PME status can be reset by PCI RST# */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   352
	/* TBICSR p.28 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   353
	TBIReset	= 0x80000000,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   354
	TBILoopback	= 0x40000000,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   355
	TBINwEnable	= 0x20000000,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
	TBINwRestart	= 0x10000000,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
	TBILinkOk	= 0x02000000,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   358
	TBINwComplete	= 0x01000000,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
	/* CPlusCmd p.31 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   361
	EnableBist	= (1 << 15),	// 8168 8101
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
	Mac_dbgo_oe	= (1 << 14),	// 8168 8101
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   363
	Normal_mode	= (1 << 13),	// unused
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
	Force_half_dup	= (1 << 12),	// 8168 8101
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   365
	Force_rxflow_en	= (1 << 11),	// 8168 8101
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   366
	Force_txflow_en	= (1 << 10),	// 8168 8101
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   367
	Cxpl_dbg_sel	= (1 << 9),	// 8168 8101
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   368
	ASF		= (1 << 8),	// 8168 8101
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   369
	PktCntrDisable	= (1 << 7),	// 8168 8101
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
	Mac_dbgo_sel	= 0x001c,	// 8168
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   371
	RxVlan		= (1 << 6),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
	RxChkSum	= (1 << 5),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
	PCIDAC		= (1 << 4),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   374
	PCIMulRW	= (1 << 3),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   375
	INTT_0		= 0x0000,	// 8168
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
	INTT_1		= 0x0001,	// 8168
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
	INTT_2		= 0x0002,	// 8168
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   378
	INTT_3		= 0x0003,	// 8168
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   379
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
	/* rtl8169_PHYstatus */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
	TBI_Enable	= 0x80,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   382
	TxFlowCtrl	= 0x40,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   383
	RxFlowCtrl	= 0x20,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   384
	_1000bpsF	= 0x10,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   385
	_100bps		= 0x08,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   386
	_10bps		= 0x04,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   387
	LinkStatus	= 0x02,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   388
	FullDup		= 0x01,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   389
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   390
	/* _TBICSRBit */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
	TBILinkOK	= 0x02000000,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   392
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   393
	/* DumpCounterCommand */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   394
	CounterDump	= 0x8,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   395
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   396
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   397
enum desc_status_bit {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   398
	DescOwn		= (1 << 31), /* Descriptor is owned by NIC */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
	RingEnd		= (1 << 30), /* End of descriptor ring */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   400
	FirstFrag	= (1 << 29), /* First segment of a packet */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   401
	LastFrag	= (1 << 28), /* Final segment of a packet */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   402
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   403
	/* Tx private */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   404
	LargeSend	= (1 << 27), /* TCP Large Send Offload (TSO) */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
	MSSShift	= 16,        /* MSS value position */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   406
	MSSMask		= 0xfff,     /* MSS value + LargeSend bit: 12 bits */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   407
	IPCS		= (1 << 18), /* Calculate IP checksum */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   408
	UDPCS		= (1 << 17), /* Calculate UDP/IP checksum */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   409
	TCPCS		= (1 << 16), /* Calculate TCP/IP checksum */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   410
	TxVlanTag	= (1 << 17), /* Add VLAN tag */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   411
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   412
	/* Rx private */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   413
	PID1		= (1 << 18), /* Protocol ID bit 1/2 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   414
	PID0		= (1 << 17), /* Protocol ID bit 2/2 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   415
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   416
#define RxProtoUDP	(PID1)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   417
#define RxProtoTCP	(PID0)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   418
#define RxProtoIP	(PID1 | PID0)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   419
#define RxProtoMask	RxProtoIP
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   420
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   421
	IPFail		= (1 << 16), /* IP checksum failed */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   422
	UDPFail		= (1 << 15), /* UDP/IP checksum failed */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   423
	TCPFail		= (1 << 14), /* TCP/IP checksum failed */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   424
	RxVlanTag	= (1 << 16), /* VLAN tag available */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   425
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   426
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   427
#define RsvdMask	0x3fffc000
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   428
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   429
struct TxDesc {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   430
	__le32 opts1;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   431
	__le32 opts2;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   432
	__le64 addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   433
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   434
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   435
struct RxDesc {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   436
	__le32 opts1;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   437
	__le32 opts2;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   438
	__le64 addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   439
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   440
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   441
struct ring_info {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   442
	struct sk_buff	*skb;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   443
	u32		len;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   444
	u8		__pad[sizeof(void *) - sizeof(u32)];
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   445
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   446
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   447
enum features {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   448
	RTL_FEATURE_WOL		= (1 << 0),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   449
	RTL_FEATURE_MSI		= (1 << 1),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   450
	RTL_FEATURE_GMII	= (1 << 2),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   451
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   452
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   453
struct rtl8169_counters {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   454
	__le64	tx_packets;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   455
	__le64	rx_packets;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   456
	__le64	tx_errors;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   457
	__le32	rx_errors;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   458
	__le16	rx_missed;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
	__le16	align_errors;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   460
	__le32	tx_one_collision;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   461
	__le32	tx_multi_collision;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   462
	__le64	rx_unicast;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   463
	__le64	rx_broadcast;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   464
	__le32	rx_multicast;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   465
	__le16	tx_aborted;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   466
	__le16	tx_underun;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   467
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   468
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   469
struct rtl8169_private {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   470
	void __iomem *mmio_addr;	/* memory map physical address */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   471
	struct pci_dev *pci_dev;	/* Index of PCI device */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   472
	struct net_device *dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   473
	struct napi_struct napi;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   474
	spinlock_t lock;		/* spin lock flag */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   475
	u32 msg_enable;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   476
	int chipset;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   477
	int mac_version;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   478
	u32 cur_rx; /* Index into the Rx descriptor buffer of next Rx pkt. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   479
	u32 cur_tx; /* Index into the Tx descriptor buffer of next Rx pkt. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   480
	u32 dirty_rx;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   481
	u32 dirty_tx;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   482
	struct TxDesc *TxDescArray;	/* 256-aligned Tx descriptor ring */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   483
	struct RxDesc *RxDescArray;	/* 256-aligned Rx descriptor ring */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   484
	dma_addr_t TxPhyAddr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   485
	dma_addr_t RxPhyAddr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   486
	void *Rx_databuff[NUM_RX_DESC];	/* Rx data buffers */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   487
	struct ring_info tx_skb[NUM_TX_DESC];	/* Tx data buffers */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   488
	struct timer_list timer;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   489
	u16 cp_cmd;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   490
	u16 intr_event;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   491
	u16 napi_event;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   492
	u16 intr_mask;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   493
	int phy_1000_ctrl_reg;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   494
#ifdef CONFIG_R8169_VLAN
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   495
	struct vlan_group *vlgrp;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   496
#endif
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   497
	int (*set_speed)(struct net_device *, u8 autoneg, u16 speed, u8 duplex);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   498
	int (*get_settings)(struct net_device *, struct ethtool_cmd *);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   499
	void (*phy_reset_enable)(void __iomem *);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   500
	void (*hw_start)(struct net_device *);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   501
	unsigned int (*phy_reset_pending)(void __iomem *);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   502
	unsigned int (*link_ok)(void __iomem *);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   503
	int (*do_ioctl)(struct rtl8169_private *tp, struct mii_ioctl_data *data, int cmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   504
	int pcie_cap;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   505
	struct delayed_work task;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   506
	unsigned features;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   507
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   508
	struct mii_if_info mii;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   509
	struct rtl8169_counters counters;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   510
	u32 saved_wolopts;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   511
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   512
	ec_device_t *ecdev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   513
	unsigned long ec_watchdog_jiffies;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   514
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   515
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   516
MODULE_AUTHOR("Realtek and the Linux r8169 crew <netdev@vger.kernel.org>");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   517
MODULE_DESCRIPTION("RealTek RTL-8169 Gigabit Ethernet driver (EtherCAT)");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   518
module_param(use_dac, int, 0);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   519
MODULE_PARM_DESC(use_dac, "Enable PCI DAC. Unsafe on 32 bit PCI slot.");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   520
module_param_named(debug, debug.msg_enable, int, 0);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   521
MODULE_PARM_DESC(debug, "Debug verbosity level (0=none, ..., 16=all)");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   522
MODULE_LICENSE("GPL");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   523
MODULE_VERSION(EC_MASTER_VERSION);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   524
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   525
static int rtl8169_open(struct net_device *dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   526
static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   527
				      struct net_device *dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   528
static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   529
static int rtl8169_init_ring(struct net_device *dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   530
static void rtl_hw_start(struct net_device *dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   531
static int rtl8169_close(struct net_device *dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   532
static void rtl_set_rx_mode(struct net_device *dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   533
static void rtl8169_tx_timeout(struct net_device *dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   534
static struct net_device_stats *rtl8169_get_stats(struct net_device *dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   535
static int rtl8169_rx_interrupt(struct net_device *, struct rtl8169_private *,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   536
				void __iomem *, u32 budget);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   537
static int rtl8169_change_mtu(struct net_device *dev, int new_mtu);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   538
static void rtl8169_down(struct net_device *dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   539
static void rtl8169_rx_clear(struct rtl8169_private *tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   540
static void ec_poll(struct net_device *dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   541
static int rtl8169_poll(struct napi_struct *napi, int budget);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   542
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   543
static const unsigned int rtl8169_rx_config =
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   544
	(RX_FIFO_THRESH << RxCfgFIFOShift) | (RX_DMA_BURST << RxCfgDMAShift);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   545
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   546
static void mdio_write(void __iomem *ioaddr, int reg_addr, int value)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   547
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   548
	int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   549
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   550
	RTL_W32(PHYAR, 0x80000000 | (reg_addr & 0x1f) << 16 | (value & 0xffff));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   551
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   552
	for (i = 20; i > 0; i--) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   553
		/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   554
		 * Check if the RTL8169 has completed writing to the specified
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   555
		 * MII register.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   556
		 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   557
		if (!(RTL_R32(PHYAR) & 0x80000000))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   558
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   559
		udelay(25);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   560
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   561
	/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   562
	 * According to hardware specs a 20us delay is required after write
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   563
	 * complete indication, but before sending next command.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   564
	 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   565
	udelay(20);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   566
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   567
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   568
static int mdio_read(void __iomem *ioaddr, int reg_addr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   569
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   570
	int i, value = -1;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   571
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   572
	RTL_W32(PHYAR, 0x0 | (reg_addr & 0x1f) << 16);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   573
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   574
	for (i = 20; i > 0; i--) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   575
		/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   576
		 * Check if the RTL8169 has completed retrieving data from
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   577
		 * the specified MII register.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   578
		 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   579
		if (RTL_R32(PHYAR) & 0x80000000) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   580
			value = RTL_R32(PHYAR) & 0xffff;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   581
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   582
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   583
		udelay(25);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   584
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   585
	/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   586
	 * According to hardware specs a 20us delay is required after read
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   587
	 * complete indication, but before sending next command.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   588
	 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   589
	udelay(20);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   590
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   591
	return value;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   592
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   593
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   594
static void mdio_patch(void __iomem *ioaddr, int reg_addr, int value)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   595
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   596
	mdio_write(ioaddr, reg_addr, mdio_read(ioaddr, reg_addr) | value);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   597
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   598
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   599
static void mdio_plus_minus(void __iomem *ioaddr, int reg_addr, int p, int m)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   600
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   601
	int val;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   602
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   603
	val = mdio_read(ioaddr, reg_addr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   604
	mdio_write(ioaddr, reg_addr, (val | p) & ~m);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   605
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   606
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   607
static void rtl_mdio_write(struct net_device *dev, int phy_id, int location,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   608
			   int val)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   609
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   610
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   611
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   612
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   613
	mdio_write(ioaddr, location, val);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   614
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   615
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   616
static int rtl_mdio_read(struct net_device *dev, int phy_id, int location)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   617
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   618
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   619
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   620
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   621
	return mdio_read(ioaddr, location);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   622
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   623
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   624
static void rtl_ephy_write(void __iomem *ioaddr, int reg_addr, int value)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   625
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   626
	unsigned int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   627
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   628
	RTL_W32(EPHYAR, EPHYAR_WRITE_CMD | (value & EPHYAR_DATA_MASK) |
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   629
		(reg_addr & EPHYAR_REG_MASK) << EPHYAR_REG_SHIFT);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   630
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   631
	for (i = 0; i < 100; i++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   632
		if (!(RTL_R32(EPHYAR) & EPHYAR_FLAG))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   633
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   634
		udelay(10);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   635
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   636
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   637
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   638
static u16 rtl_ephy_read(void __iomem *ioaddr, int reg_addr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   639
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   640
	u16 value = 0xffff;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   641
	unsigned int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   642
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   643
	RTL_W32(EPHYAR, (reg_addr & EPHYAR_REG_MASK) << EPHYAR_REG_SHIFT);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   644
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   645
	for (i = 0; i < 100; i++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   646
		if (RTL_R32(EPHYAR) & EPHYAR_FLAG) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   647
			value = RTL_R32(EPHYAR) & EPHYAR_DATA_MASK;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   648
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   649
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   650
		udelay(10);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   651
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   652
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   653
	return value;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   654
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   655
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   656
static void rtl_csi_write(void __iomem *ioaddr, int addr, int value)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   657
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   658
	unsigned int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   659
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   660
	RTL_W32(CSIDR, value);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   661
	RTL_W32(CSIAR, CSIAR_WRITE_CMD | (addr & CSIAR_ADDR_MASK) |
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   662
		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   663
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   664
	for (i = 0; i < 100; i++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   665
		if (!(RTL_R32(CSIAR) & CSIAR_FLAG))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   666
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   667
		udelay(10);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   668
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   669
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   670
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   671
static u32 rtl_csi_read(void __iomem *ioaddr, int addr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   672
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   673
	u32 value = ~0x00;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   674
	unsigned int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   675
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   676
	RTL_W32(CSIAR, (addr & CSIAR_ADDR_MASK) |
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   677
		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   678
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   679
	for (i = 0; i < 100; i++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   680
		if (RTL_R32(CSIAR) & CSIAR_FLAG) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   681
			value = RTL_R32(CSIDR);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   682
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   683
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   684
		udelay(10);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   685
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   686
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   687
	return value;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   688
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   689
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   690
static u8 rtl8168d_efuse_read(void __iomem *ioaddr, int reg_addr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   691
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   692
	u8 value = 0xff;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   693
	unsigned int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   694
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   695
	RTL_W32(EFUSEAR, (reg_addr & EFUSEAR_REG_MASK) << EFUSEAR_REG_SHIFT);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   696
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   697
	for (i = 0; i < 300; i++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   698
		if (RTL_R32(EFUSEAR) & EFUSEAR_FLAG) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   699
			value = RTL_R32(EFUSEAR) & EFUSEAR_DATA_MASK;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   700
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   701
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   702
		udelay(100);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   703
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   704
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   705
	return value;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   706
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   707
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   708
static void rtl8169_irq_mask_and_ack(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   709
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   710
	RTL_W16(IntrMask, 0x0000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   711
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   712
	RTL_W16(IntrStatus, 0xffff);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   713
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   714
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   715
static void rtl8169_asic_down(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   716
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   717
	RTL_W8(ChipCmd, 0x00);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   718
	rtl8169_irq_mask_and_ack(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   719
	RTL_R16(CPlusCmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   720
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   721
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   722
static unsigned int rtl8169_tbi_reset_pending(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   723
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   724
	return RTL_R32(TBICSR) & TBIReset;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   725
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   726
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   727
static unsigned int rtl8169_xmii_reset_pending(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   728
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   729
	return mdio_read(ioaddr, MII_BMCR) & BMCR_RESET;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   730
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   731
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   732
static unsigned int rtl8169_tbi_link_ok(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   733
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   734
	return RTL_R32(TBICSR) & TBILinkOk;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   735
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   736
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   737
static unsigned int rtl8169_xmii_link_ok(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   738
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   739
	return RTL_R8(PHYstatus) & LinkStatus;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   740
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   741
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   742
static void rtl8169_tbi_reset_enable(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   743
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   744
	RTL_W32(TBICSR, RTL_R32(TBICSR) | TBIReset);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   745
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   746
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   747
static void rtl8169_xmii_reset_enable(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   748
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   749
	unsigned int val;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   750
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   751
	val = mdio_read(ioaddr, MII_BMCR) | BMCR_RESET;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   752
	mdio_write(ioaddr, MII_BMCR, val & 0xffff);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   753
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   754
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   755
static void __rtl8169_check_link_status(struct net_device *dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   756
				      struct rtl8169_private *tp,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   757
				      void __iomem *ioaddr,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   758
				      bool pm)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   759
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   760
	unsigned long flags;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   761
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   762
	if (tp->ecdev) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   763
		ecdev_set_link(tp->ecdev, tp->link_ok(ioaddr) ? 1 : 0);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   764
		return;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   765
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   766
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   767
	spin_lock_irqsave(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   768
	if (tp->link_ok(ioaddr)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   769
		/* This is to cancel a scheduled suspend if there's one. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   770
		if (pm)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   771
			pm_request_resume(&tp->pci_dev->dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   772
		netif_carrier_on(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   773
		if (net_ratelimit())
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   774
			netif_info(tp, ifup, dev, "link up\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   775
	} else {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   776
		netif_carrier_off(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   777
		netif_info(tp, ifdown, dev, "link down\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   778
		if (pm)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   779
			pm_schedule_suspend(&tp->pci_dev->dev, 100);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   780
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   781
	spin_unlock_irqrestore(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   782
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   783
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   784
static void rtl8169_check_link_status(struct net_device *dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   785
				      struct rtl8169_private *tp,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   786
				      void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   787
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   788
	__rtl8169_check_link_status(dev, tp, ioaddr, false);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   789
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   790
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   791
#define WAKE_ANY (WAKE_PHY | WAKE_MAGIC | WAKE_UCAST | WAKE_BCAST | WAKE_MCAST)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   792
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   793
static u32 __rtl8169_get_wol(struct rtl8169_private *tp)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   794
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   795
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   796
	u8 options;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   797
	u32 wolopts = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   798
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   799
	options = RTL_R8(Config1);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   800
	if (!(options & PMEnable))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   801
		return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   802
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   803
	options = RTL_R8(Config3);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   804
	if (options & LinkUp)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   805
		wolopts |= WAKE_PHY;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   806
	if (options & MagicPacket)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   807
		wolopts |= WAKE_MAGIC;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   808
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   809
	options = RTL_R8(Config5);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   810
	if (options & UWF)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   811
		wolopts |= WAKE_UCAST;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   812
	if (options & BWF)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   813
		wolopts |= WAKE_BCAST;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   814
	if (options & MWF)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   815
		wolopts |= WAKE_MCAST;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   816
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   817
	return wolopts;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   818
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   819
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   820
static void rtl8169_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   821
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   822
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   823
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   824
	spin_lock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   825
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   826
	wol->supported = WAKE_ANY;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   827
	wol->wolopts = __rtl8169_get_wol(tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   828
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   829
	spin_unlock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   830
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   831
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   832
static void __rtl8169_set_wol(struct rtl8169_private *tp, u32 wolopts)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   833
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   834
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   835
	unsigned int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   836
	static const struct {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   837
		u32 opt;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   838
		u16 reg;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   839
		u8  mask;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   840
	} cfg[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   841
		{ WAKE_ANY,   Config1, PMEnable },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   842
		{ WAKE_PHY,   Config3, LinkUp },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   843
		{ WAKE_MAGIC, Config3, MagicPacket },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   844
		{ WAKE_UCAST, Config5, UWF },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   845
		{ WAKE_BCAST, Config5, BWF },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   846
		{ WAKE_MCAST, Config5, MWF },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   847
		{ WAKE_ANY,   Config5, LanWake }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   848
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   849
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   850
	RTL_W8(Cfg9346, Cfg9346_Unlock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   851
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   852
	for (i = 0; i < ARRAY_SIZE(cfg); i++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   853
		u8 options = RTL_R8(cfg[i].reg) & ~cfg[i].mask;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   854
		if (wolopts & cfg[i].opt)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   855
			options |= cfg[i].mask;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   856
		RTL_W8(cfg[i].reg, options);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   857
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   858
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   859
	RTL_W8(Cfg9346, Cfg9346_Lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   860
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   861
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   862
static int rtl8169_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   863
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   864
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   865
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   866
	spin_lock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   867
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   868
	if (wol->wolopts)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   869
		tp->features |= RTL_FEATURE_WOL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   870
	else
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   871
		tp->features &= ~RTL_FEATURE_WOL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   872
	__rtl8169_set_wol(tp, wol->wolopts);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   873
	spin_unlock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   874
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   875
	device_set_wakeup_enable(&tp->pci_dev->dev, wol->wolopts);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   876
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   877
	return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   878
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   879
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   880
static void rtl8169_get_drvinfo(struct net_device *dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   881
				struct ethtool_drvinfo *info)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   882
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   883
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   884
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   885
	strcpy(info->driver, MODULENAME);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   886
	strcpy(info->version, RTL8169_VERSION);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   887
	strcpy(info->bus_info, pci_name(tp->pci_dev));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   888
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   889
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   890
static int rtl8169_get_regs_len(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   891
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   892
	return R8169_REGS_SIZE;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   893
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   894
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   895
static int rtl8169_set_speed_tbi(struct net_device *dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   896
				 u8 autoneg, u16 speed, u8 duplex)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   897
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   898
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   899
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   900
	int ret = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   901
	u32 reg;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   902
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   903
	reg = RTL_R32(TBICSR);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   904
	if ((autoneg == AUTONEG_DISABLE) && (speed == SPEED_1000) &&
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   905
	    (duplex == DUPLEX_FULL)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   906
		RTL_W32(TBICSR, reg & ~(TBINwEnable | TBINwRestart));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   907
	} else if (autoneg == AUTONEG_ENABLE)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   908
		RTL_W32(TBICSR, reg | TBINwEnable | TBINwRestart);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   909
	else {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   910
		netif_warn(tp, link, dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   911
			   "incorrect speed setting refused in TBI mode\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   912
		ret = -EOPNOTSUPP;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   913
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   914
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   915
	return ret;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   916
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   917
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   918
static int rtl8169_set_speed_xmii(struct net_device *dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   919
				  u8 autoneg, u16 speed, u8 duplex)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   920
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   921
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   922
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   923
	int giga_ctrl, bmcr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   924
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   925
	if (autoneg == AUTONEG_ENABLE) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   926
		int auto_nego;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   927
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   928
		auto_nego = mdio_read(ioaddr, MII_ADVERTISE);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   929
		auto_nego |= (ADVERTISE_10HALF | ADVERTISE_10FULL |
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   930
			      ADVERTISE_100HALF | ADVERTISE_100FULL);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   931
		auto_nego |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   932
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   933
		giga_ctrl = mdio_read(ioaddr, MII_CTRL1000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   934
		giga_ctrl &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   935
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   936
		/* The 8100e/8101e/8102e do Fast Ethernet only. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   937
		if ((tp->mac_version != RTL_GIGA_MAC_VER_07) &&
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   938
		    (tp->mac_version != RTL_GIGA_MAC_VER_08) &&
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   939
		    (tp->mac_version != RTL_GIGA_MAC_VER_09) &&
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   940
		    (tp->mac_version != RTL_GIGA_MAC_VER_10) &&
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   941
		    (tp->mac_version != RTL_GIGA_MAC_VER_13) &&
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   942
		    (tp->mac_version != RTL_GIGA_MAC_VER_14) &&
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   943
		    (tp->mac_version != RTL_GIGA_MAC_VER_15) &&
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   944
		    (tp->mac_version != RTL_GIGA_MAC_VER_16)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   945
			giga_ctrl |= ADVERTISE_1000FULL | ADVERTISE_1000HALF;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   946
		} else {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   947
			netif_info(tp, link, dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   948
				   "PHY does not support 1000Mbps\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   949
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   950
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   951
		bmcr = BMCR_ANENABLE | BMCR_ANRESTART;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   952
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   953
		if ((tp->mac_version == RTL_GIGA_MAC_VER_11) ||
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   954
		    (tp->mac_version == RTL_GIGA_MAC_VER_12) ||
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   955
		    (tp->mac_version >= RTL_GIGA_MAC_VER_17)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   956
			/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   957
			 * Wake up the PHY.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   958
			 * Vendor specific (0x1f) and reserved (0x0e) MII
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   959
			 * registers.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   960
			 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   961
			mdio_write(ioaddr, 0x1f, 0x0000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   962
			mdio_write(ioaddr, 0x0e, 0x0000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   963
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   964
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   965
		mdio_write(ioaddr, MII_ADVERTISE, auto_nego);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   966
		mdio_write(ioaddr, MII_CTRL1000, giga_ctrl);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   967
	} else {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   968
		giga_ctrl = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   969
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   970
		if (speed == SPEED_10)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   971
			bmcr = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   972
		else if (speed == SPEED_100)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   973
			bmcr = BMCR_SPEED100;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   974
		else
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   975
			return -EINVAL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   976
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   977
		if (duplex == DUPLEX_FULL)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   978
			bmcr |= BMCR_FULLDPLX;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   979
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   980
		mdio_write(ioaddr, 0x1f, 0x0000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   981
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   982
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   983
	tp->phy_1000_ctrl_reg = giga_ctrl;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   984
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   985
	mdio_write(ioaddr, MII_BMCR, bmcr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   986
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   987
	if ((tp->mac_version == RTL_GIGA_MAC_VER_02) ||
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   988
	    (tp->mac_version == RTL_GIGA_MAC_VER_03)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   989
		if ((speed == SPEED_100) && (autoneg != AUTONEG_ENABLE)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   990
			mdio_write(ioaddr, 0x17, 0x2138);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   991
			mdio_write(ioaddr, 0x0e, 0x0260);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   992
		} else {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   993
			mdio_write(ioaddr, 0x17, 0x2108);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   994
			mdio_write(ioaddr, 0x0e, 0x0000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   995
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   996
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   997
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   998
	return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   999
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1000
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1001
static int rtl8169_set_speed(struct net_device *dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1002
			     u8 autoneg, u16 speed, u8 duplex)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1003
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1004
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1005
	int ret;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1006
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1007
	ret = tp->set_speed(dev, autoneg, speed, duplex);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1008
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1009
	if (netif_running(dev) && (tp->phy_1000_ctrl_reg & ADVERTISE_1000FULL))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1010
		mod_timer(&tp->timer, jiffies + RTL8169_PHY_TIMEOUT);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1011
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1012
	return ret;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1013
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1014
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1015
static int rtl8169_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1016
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1017
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1018
	unsigned long flags;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1019
	int ret;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1020
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1021
	spin_lock_irqsave(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1022
	ret = rtl8169_set_speed(dev, cmd->autoneg, cmd->speed, cmd->duplex);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1023
	spin_unlock_irqrestore(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1024
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1025
	return ret;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1026
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1027
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1028
static u32 rtl8169_get_rx_csum(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1029
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1030
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1031
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1032
	return tp->cp_cmd & RxChkSum;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1033
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1034
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1035
static int rtl8169_set_rx_csum(struct net_device *dev, u32 data)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1036
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1037
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1038
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1039
	unsigned long flags;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1040
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1041
	spin_lock_irqsave(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1042
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1043
	if (data)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1044
		tp->cp_cmd |= RxChkSum;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1045
	else
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1046
		tp->cp_cmd &= ~RxChkSum;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1047
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1048
	RTL_W16(CPlusCmd, tp->cp_cmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1049
	RTL_R16(CPlusCmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1050
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1051
	spin_unlock_irqrestore(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1052
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1053
	return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1054
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1055
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1056
#ifdef CONFIG_R8169_VLAN
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1057
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1058
static inline u32 rtl8169_tx_vlan_tag(struct rtl8169_private *tp,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1059
				      struct sk_buff *skb)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1060
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1061
	return (vlan_tx_tag_present(skb)) ?
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1062
		TxVlanTag | swab16(vlan_tx_tag_get(skb)) : 0x00;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1063
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1064
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1065
static void rtl8169_vlan_rx_register(struct net_device *dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1066
				     struct vlan_group *grp)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1067
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1068
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1069
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1070
	unsigned long flags;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1071
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1072
	spin_lock_irqsave(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1073
	tp->vlgrp = grp;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1074
	/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1075
	 * Do not disable RxVlan on 8110SCd.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1076
	 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1077
	if (tp->vlgrp || (tp->mac_version == RTL_GIGA_MAC_VER_05))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1078
		tp->cp_cmd |= RxVlan;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1079
	else
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1080
		tp->cp_cmd &= ~RxVlan;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1081
	RTL_W16(CPlusCmd, tp->cp_cmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1082
	RTL_R16(CPlusCmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1083
	spin_unlock_irqrestore(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1084
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1085
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1086
static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1087
			       struct sk_buff *skb, int polling)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1088
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1089
	u32 opts2 = le32_to_cpu(desc->opts2);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1090
	struct vlan_group *vlgrp = tp->vlgrp;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1091
	int ret;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1092
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1093
	if (vlgrp && (opts2 & RxVlanTag)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1094
		u16 vtag = swab16(opts2 & 0xffff);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1095
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1096
		if (likely(polling))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1097
			vlan_gro_receive(&tp->napi, vlgrp, vtag, skb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1098
		else
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1099
			__vlan_hwaccel_rx(skb, vlgrp, vtag, polling);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1100
		ret = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1101
	} else
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1102
		ret = -1;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1103
	desc->opts2 = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1104
	return ret;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1105
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1106
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1107
#else /* !CONFIG_R8169_VLAN */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1108
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1109
static inline u32 rtl8169_tx_vlan_tag(struct rtl8169_private *tp,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1110
				      struct sk_buff *skb)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1111
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1112
	return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1113
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1114
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1115
static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1116
			       struct sk_buff *skb, int polling)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1117
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1118
	return -1;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1119
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1120
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1121
#endif
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1122
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1123
static int rtl8169_gset_tbi(struct net_device *dev, struct ethtool_cmd *cmd)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1124
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1125
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1126
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1127
	u32 status;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1128
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1129
	cmd->supported =
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1130
		SUPPORTED_1000baseT_Full | SUPPORTED_Autoneg | SUPPORTED_FIBRE;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1131
	cmd->port = PORT_FIBRE;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1132
	cmd->transceiver = XCVR_INTERNAL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1133
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1134
	status = RTL_R32(TBICSR);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1135
	cmd->advertising = (status & TBINwEnable) ?  ADVERTISED_Autoneg : 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1136
	cmd->autoneg = !!(status & TBINwEnable);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1137
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1138
	cmd->speed = SPEED_1000;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1139
	cmd->duplex = DUPLEX_FULL; /* Always set */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1140
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1141
	return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1142
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1143
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1144
static int rtl8169_gset_xmii(struct net_device *dev, struct ethtool_cmd *cmd)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1145
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1146
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1147
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1148
	return mii_ethtool_gset(&tp->mii, cmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1149
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1150
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1151
static int rtl8169_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1152
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1153
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1154
	unsigned long flags;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1155
	int rc;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1156
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1157
	spin_lock_irqsave(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1158
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1159
	rc = tp->get_settings(dev, cmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1160
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1161
	spin_unlock_irqrestore(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1162
	return rc;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1163
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1164
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1165
static void rtl8169_get_regs(struct net_device *dev, struct ethtool_regs *regs,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1166
			     void *p)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1167
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1168
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1169
	unsigned long flags;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1170
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1171
	if (regs->len > R8169_REGS_SIZE)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1172
		regs->len = R8169_REGS_SIZE;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1173
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1174
	spin_lock_irqsave(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1175
	memcpy_fromio(p, tp->mmio_addr, regs->len);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1176
	spin_unlock_irqrestore(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1177
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1178
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1179
static u32 rtl8169_get_msglevel(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1180
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1181
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1182
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1183
	return tp->msg_enable;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1184
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1185
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1186
static void rtl8169_set_msglevel(struct net_device *dev, u32 value)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1187
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1188
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1189
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1190
	tp->msg_enable = value;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1191
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1192
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1193
static const char rtl8169_gstrings[][ETH_GSTRING_LEN] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1194
	"tx_packets",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1195
	"rx_packets",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1196
	"tx_errors",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1197
	"rx_errors",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1198
	"rx_missed",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1199
	"align_errors",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1200
	"tx_single_collisions",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1201
	"tx_multi_collisions",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1202
	"unicast",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1203
	"broadcast",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1204
	"multicast",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1205
	"tx_aborted",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1206
	"tx_underrun",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1207
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1208
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1209
static int rtl8169_get_sset_count(struct net_device *dev, int sset)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1210
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1211
	switch (sset) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1212
	case ETH_SS_STATS:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1213
		return ARRAY_SIZE(rtl8169_gstrings);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1214
	default:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1215
		return -EOPNOTSUPP;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1216
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1217
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1218
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1219
static void rtl8169_update_counters(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1220
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1221
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1222
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1223
	struct rtl8169_counters *counters;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1224
	dma_addr_t paddr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1225
	u32 cmd;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1226
	int wait = 1000;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1227
	struct device *d = &tp->pci_dev->dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1228
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1229
	/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1230
	 * Some chips are unable to dump tally counters when the receiver
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1231
	 * is disabled.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1232
	 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1233
	if ((RTL_R8(ChipCmd) & CmdRxEnb) == 0)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1234
		return;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1235
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1236
	counters = dma_alloc_coherent(d, sizeof(*counters), &paddr, GFP_KERNEL);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1237
	if (!counters)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1238
		return;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1239
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1240
	RTL_W32(CounterAddrHigh, (u64)paddr >> 32);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1241
	cmd = (u64)paddr & DMA_BIT_MASK(32);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1242
	RTL_W32(CounterAddrLow, cmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1243
	RTL_W32(CounterAddrLow, cmd | CounterDump);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1244
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1245
	while (wait--) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1246
		if ((RTL_R32(CounterAddrLow) & CounterDump) == 0) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1247
			/* copy updated counters */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1248
			memcpy(&tp->counters, counters, sizeof(*counters));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1249
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1250
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1251
		udelay(10);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1252
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1253
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1254
	RTL_W32(CounterAddrLow, 0);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1255
	RTL_W32(CounterAddrHigh, 0);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1256
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1257
	dma_free_coherent(d, sizeof(*counters), counters, paddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1258
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1259
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1260
static void rtl8169_get_ethtool_stats(struct net_device *dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1261
				      struct ethtool_stats *stats, u64 *data)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1262
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1263
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1264
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1265
	ASSERT_RTNL();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1266
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1267
	rtl8169_update_counters(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1268
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1269
	data[0] = le64_to_cpu(tp->counters.tx_packets);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1270
	data[1] = le64_to_cpu(tp->counters.rx_packets);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1271
	data[2] = le64_to_cpu(tp->counters.tx_errors);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1272
	data[3] = le32_to_cpu(tp->counters.rx_errors);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1273
	data[4] = le16_to_cpu(tp->counters.rx_missed);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1274
	data[5] = le16_to_cpu(tp->counters.align_errors);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1275
	data[6] = le32_to_cpu(tp->counters.tx_one_collision);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1276
	data[7] = le32_to_cpu(tp->counters.tx_multi_collision);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1277
	data[8] = le64_to_cpu(tp->counters.rx_unicast);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1278
	data[9] = le64_to_cpu(tp->counters.rx_broadcast);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1279
	data[10] = le32_to_cpu(tp->counters.rx_multicast);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1280
	data[11] = le16_to_cpu(tp->counters.tx_aborted);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1281
	data[12] = le16_to_cpu(tp->counters.tx_underun);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1282
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1283
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1284
static void rtl8169_get_strings(struct net_device *dev, u32 stringset, u8 *data)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1285
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1286
	switch(stringset) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1287
	case ETH_SS_STATS:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1288
		memcpy(data, *rtl8169_gstrings, sizeof(rtl8169_gstrings));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1289
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1290
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1291
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1292
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1293
static const struct ethtool_ops rtl8169_ethtool_ops = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1294
	.get_drvinfo		= rtl8169_get_drvinfo,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1295
	.get_regs_len		= rtl8169_get_regs_len,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1296
	.get_link		= ethtool_op_get_link,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1297
	.get_settings		= rtl8169_get_settings,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1298
	.set_settings		= rtl8169_set_settings,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1299
	.get_msglevel		= rtl8169_get_msglevel,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1300
	.set_msglevel		= rtl8169_set_msglevel,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1301
	.get_rx_csum		= rtl8169_get_rx_csum,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1302
	.set_rx_csum		= rtl8169_set_rx_csum,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1303
	.set_tx_csum		= ethtool_op_set_tx_csum,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1304
	.set_sg			= ethtool_op_set_sg,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1305
	.set_tso		= ethtool_op_set_tso,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1306
	.get_regs		= rtl8169_get_regs,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1307
	.get_wol		= rtl8169_get_wol,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1308
	.set_wol		= rtl8169_set_wol,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1309
	.get_strings		= rtl8169_get_strings,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1310
	.get_sset_count		= rtl8169_get_sset_count,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1311
	.get_ethtool_stats	= rtl8169_get_ethtool_stats,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1312
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1313
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1314
static void rtl8169_get_mac_version(struct rtl8169_private *tp,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1315
				    void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1316
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1317
	/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1318
	 * The driver currently handles the 8168Bf and the 8168Be identically
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1319
	 * but they can be identified more specifically through the test below
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1320
	 * if needed:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1321
	 *
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1322
	 * (RTL_R32(TxConfig) & 0x700000) == 0x500000 ? 8168Bf : 8168Be
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1323
	 *
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1324
	 * Same thing for the 8101Eb and the 8101Ec:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1325
	 *
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1326
	 * (RTL_R32(TxConfig) & 0x700000) == 0x200000 ? 8101Eb : 8101Ec
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1327
	 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1328
	static const struct {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1329
		u32 mask;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1330
		u32 val;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1331
		int mac_version;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1332
	} mac_info[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1333
		/* 8168D family. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1334
		{ 0x7cf00000, 0x28300000,	RTL_GIGA_MAC_VER_26 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1335
		{ 0x7cf00000, 0x28100000,	RTL_GIGA_MAC_VER_25 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1336
		{ 0x7c800000, 0x28800000,	RTL_GIGA_MAC_VER_27 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1337
		{ 0x7c800000, 0x28000000,	RTL_GIGA_MAC_VER_26 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1338
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1339
		/* 8168C family. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1340
		{ 0x7cf00000, 0x3cb00000,	RTL_GIGA_MAC_VER_24 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1341
		{ 0x7cf00000, 0x3c900000,	RTL_GIGA_MAC_VER_23 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1342
		{ 0x7cf00000, 0x3c800000,	RTL_GIGA_MAC_VER_18 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1343
		{ 0x7c800000, 0x3c800000,	RTL_GIGA_MAC_VER_24 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1344
		{ 0x7cf00000, 0x3c000000,	RTL_GIGA_MAC_VER_19 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1345
		{ 0x7cf00000, 0x3c200000,	RTL_GIGA_MAC_VER_20 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1346
		{ 0x7cf00000, 0x3c300000,	RTL_GIGA_MAC_VER_21 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1347
		{ 0x7cf00000, 0x3c400000,	RTL_GIGA_MAC_VER_22 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1348
		{ 0x7c800000, 0x3c000000,	RTL_GIGA_MAC_VER_22 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1349
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1350
		/* 8168B family. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1351
		{ 0x7cf00000, 0x38000000,	RTL_GIGA_MAC_VER_12 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1352
		{ 0x7cf00000, 0x38500000,	RTL_GIGA_MAC_VER_17 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1353
		{ 0x7c800000, 0x38000000,	RTL_GIGA_MAC_VER_17 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1354
		{ 0x7c800000, 0x30000000,	RTL_GIGA_MAC_VER_11 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1355
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1356
		/* 8101 family. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1357
		{ 0x7cf00000, 0x34a00000,	RTL_GIGA_MAC_VER_09 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1358
		{ 0x7cf00000, 0x24a00000,	RTL_GIGA_MAC_VER_09 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1359
		{ 0x7cf00000, 0x34900000,	RTL_GIGA_MAC_VER_08 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1360
		{ 0x7cf00000, 0x24900000,	RTL_GIGA_MAC_VER_08 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1361
		{ 0x7cf00000, 0x34800000,	RTL_GIGA_MAC_VER_07 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1362
		{ 0x7cf00000, 0x24800000,	RTL_GIGA_MAC_VER_07 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1363
		{ 0x7cf00000, 0x34000000,	RTL_GIGA_MAC_VER_13 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1364
		{ 0x7cf00000, 0x34300000,	RTL_GIGA_MAC_VER_10 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1365
		{ 0x7cf00000, 0x34200000,	RTL_GIGA_MAC_VER_16 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1366
		{ 0x7c800000, 0x34800000,	RTL_GIGA_MAC_VER_09 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1367
		{ 0x7c800000, 0x24800000,	RTL_GIGA_MAC_VER_09 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1368
		{ 0x7c800000, 0x34000000,	RTL_GIGA_MAC_VER_16 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1369
		/* FIXME: where did these entries come from ? -- FR */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1370
		{ 0xfc800000, 0x38800000,	RTL_GIGA_MAC_VER_15 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1371
		{ 0xfc800000, 0x30800000,	RTL_GIGA_MAC_VER_14 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1372
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1373
		/* 8110 family. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1374
		{ 0xfc800000, 0x98000000,	RTL_GIGA_MAC_VER_06 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1375
		{ 0xfc800000, 0x18000000,	RTL_GIGA_MAC_VER_05 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1376
		{ 0xfc800000, 0x10000000,	RTL_GIGA_MAC_VER_04 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1377
		{ 0xfc800000, 0x04000000,	RTL_GIGA_MAC_VER_03 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1378
		{ 0xfc800000, 0x00800000,	RTL_GIGA_MAC_VER_02 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1379
		{ 0xfc800000, 0x00000000,	RTL_GIGA_MAC_VER_01 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1380
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1381
		/* Catch-all */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1382
		{ 0x00000000, 0x00000000,	RTL_GIGA_MAC_NONE   }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1383
	}, *p = mac_info;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1384
	u32 reg;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1385
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1386
	reg = RTL_R32(TxConfig);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1387
	while ((reg & p->mask) != p->val)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1388
		p++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1389
	tp->mac_version = p->mac_version;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1390
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1391
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1392
static void rtl8169_print_mac_version(struct rtl8169_private *tp)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1393
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1394
	dprintk("mac_version = 0x%02x\n", tp->mac_version);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1395
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1396
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1397
struct phy_reg {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1398
	u16 reg;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1399
	u16 val;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1400
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1401
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1402
static void rtl_phy_write(void __iomem *ioaddr, const struct phy_reg *regs, int len)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1403
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1404
	while (len-- > 0) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1405
		mdio_write(ioaddr, regs->reg, regs->val);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1406
		regs++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1407
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1408
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1409
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1410
static void rtl8169s_hw_phy_config(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1411
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1412
	static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1413
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1414
		{ 0x06, 0x006e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1415
		{ 0x08, 0x0708 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1416
		{ 0x15, 0x4000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1417
		{ 0x18, 0x65c7 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1418
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1419
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1420
		{ 0x03, 0x00a1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1421
		{ 0x02, 0x0008 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1422
		{ 0x01, 0x0120 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1423
		{ 0x00, 0x1000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1424
		{ 0x04, 0x0800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1425
		{ 0x04, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1426
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1427
		{ 0x03, 0xff41 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1428
		{ 0x02, 0xdf60 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1429
		{ 0x01, 0x0140 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1430
		{ 0x00, 0x0077 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1431
		{ 0x04, 0x7800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1432
		{ 0x04, 0x7000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1433
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1434
		{ 0x03, 0x802f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1435
		{ 0x02, 0x4f02 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1436
		{ 0x01, 0x0409 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1437
		{ 0x00, 0xf0f9 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1438
		{ 0x04, 0x9800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1439
		{ 0x04, 0x9000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1440
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1441
		{ 0x03, 0xdf01 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1442
		{ 0x02, 0xdf20 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1443
		{ 0x01, 0xff95 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1444
		{ 0x00, 0xba00 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1445
		{ 0x04, 0xa800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1446
		{ 0x04, 0xa000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1447
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1448
		{ 0x03, 0xff41 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1449
		{ 0x02, 0xdf20 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1450
		{ 0x01, 0x0140 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1451
		{ 0x00, 0x00bb },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1452
		{ 0x04, 0xb800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1453
		{ 0x04, 0xb000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1454
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1455
		{ 0x03, 0xdf41 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1456
		{ 0x02, 0xdc60 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1457
		{ 0x01, 0x6340 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1458
		{ 0x00, 0x007d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1459
		{ 0x04, 0xd800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1460
		{ 0x04, 0xd000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1461
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1462
		{ 0x03, 0xdf01 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1463
		{ 0x02, 0xdf20 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1464
		{ 0x01, 0x100a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1465
		{ 0x00, 0xa0ff },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1466
		{ 0x04, 0xf800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1467
		{ 0x04, 0xf000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1468
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1469
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1470
		{ 0x0b, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1471
		{ 0x00, 0x9200 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1472
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1473
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1474
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1475
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1476
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1477
static void rtl8169sb_hw_phy_config(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1478
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1479
	static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1480
		{ 0x1f, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1481
		{ 0x01, 0x90d0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1482
		{ 0x1f, 0x0000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1483
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1484
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1485
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1486
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1487
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1488
static void rtl8169scd_hw_phy_config_quirk(struct rtl8169_private *tp,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1489
					   void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1490
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1491
	struct pci_dev *pdev = tp->pci_dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1492
	u16 vendor_id, device_id;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1493
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1494
	pci_read_config_word(pdev, PCI_SUBSYSTEM_VENDOR_ID, &vendor_id);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1495
	pci_read_config_word(pdev, PCI_SUBSYSTEM_ID, &device_id);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1496
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1497
	if ((vendor_id != PCI_VENDOR_ID_GIGABYTE) || (device_id != 0xe000))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1498
		return;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1499
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1500
	mdio_write(ioaddr, 0x1f, 0x0001);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1501
	mdio_write(ioaddr, 0x10, 0xf01b);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1502
	mdio_write(ioaddr, 0x1f, 0x0000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1503
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1504
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1505
static void rtl8169scd_hw_phy_config(struct rtl8169_private *tp,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1506
				     void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1507
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1508
	static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1509
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1510
		{ 0x04, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1511
		{ 0x03, 0x00a1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1512
		{ 0x02, 0x0008 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1513
		{ 0x01, 0x0120 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1514
		{ 0x00, 0x1000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1515
		{ 0x04, 0x0800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1516
		{ 0x04, 0x9000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1517
		{ 0x03, 0x802f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1518
		{ 0x02, 0x4f02 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1519
		{ 0x01, 0x0409 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1520
		{ 0x00, 0xf099 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1521
		{ 0x04, 0x9800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1522
		{ 0x04, 0xa000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1523
		{ 0x03, 0xdf01 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1524
		{ 0x02, 0xdf20 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1525
		{ 0x01, 0xff95 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1526
		{ 0x00, 0xba00 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1527
		{ 0x04, 0xa800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1528
		{ 0x04, 0xf000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1529
		{ 0x03, 0xdf01 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1530
		{ 0x02, 0xdf20 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1531
		{ 0x01, 0x101a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1532
		{ 0x00, 0xa0ff },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1533
		{ 0x04, 0xf800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1534
		{ 0x04, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1535
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1536
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1537
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1538
		{ 0x10, 0xf41b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1539
		{ 0x14, 0xfb54 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1540
		{ 0x18, 0xf5c7 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1541
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1542
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1543
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1544
		{ 0x17, 0x0cc0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1545
		{ 0x1f, 0x0000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1546
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1547
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1548
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1549
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1550
	rtl8169scd_hw_phy_config_quirk(tp, ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1551
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1552
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1553
static void rtl8169sce_hw_phy_config(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1554
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1555
	static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1556
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1557
		{ 0x04, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1558
		{ 0x03, 0x00a1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1559
		{ 0x02, 0x0008 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1560
		{ 0x01, 0x0120 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1561
		{ 0x00, 0x1000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1562
		{ 0x04, 0x0800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1563
		{ 0x04, 0x9000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1564
		{ 0x03, 0x802f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1565
		{ 0x02, 0x4f02 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1566
		{ 0x01, 0x0409 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1567
		{ 0x00, 0xf099 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1568
		{ 0x04, 0x9800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1569
		{ 0x04, 0xa000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1570
		{ 0x03, 0xdf01 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1571
		{ 0x02, 0xdf20 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1572
		{ 0x01, 0xff95 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1573
		{ 0x00, 0xba00 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1574
		{ 0x04, 0xa800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1575
		{ 0x04, 0xf000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1576
		{ 0x03, 0xdf01 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1577
		{ 0x02, 0xdf20 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1578
		{ 0x01, 0x101a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1579
		{ 0x00, 0xa0ff },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1580
		{ 0x04, 0xf800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1581
		{ 0x04, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1582
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1583
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1584
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1585
		{ 0x0b, 0x8480 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1586
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1587
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1588
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1589
		{ 0x18, 0x67c7 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1590
		{ 0x04, 0x2000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1591
		{ 0x03, 0x002f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1592
		{ 0x02, 0x4360 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1593
		{ 0x01, 0x0109 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1594
		{ 0x00, 0x3022 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1595
		{ 0x04, 0x2800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1596
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1597
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1598
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1599
		{ 0x17, 0x0cc0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1600
		{ 0x1f, 0x0000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1601
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1602
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1603
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1604
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1605
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1606
static void rtl8168bb_hw_phy_config(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1607
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1608
	static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1609
		{ 0x10, 0xf41b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1610
		{ 0x1f, 0x0000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1611
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1612
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1613
	mdio_write(ioaddr, 0x1f, 0x0001);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1614
	mdio_patch(ioaddr, 0x16, 1 << 0);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1615
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1616
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1617
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1618
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1619
static void rtl8168bef_hw_phy_config(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1620
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1621
	static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1622
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1623
		{ 0x10, 0xf41b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1624
		{ 0x1f, 0x0000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1625
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1626
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1627
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1628
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1629
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1630
static void rtl8168cp_1_hw_phy_config(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1631
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1632
	static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1633
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1634
		{ 0x1d, 0x0f00 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1635
		{ 0x1f, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1636
		{ 0x0c, 0x1ec8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1637
		{ 0x1f, 0x0000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1638
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1639
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1640
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1641
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1642
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1643
static void rtl8168cp_2_hw_phy_config(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1644
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1645
	static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1646
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1647
		{ 0x1d, 0x3d98 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1648
		{ 0x1f, 0x0000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1649
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1650
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1651
	mdio_write(ioaddr, 0x1f, 0x0000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1652
	mdio_patch(ioaddr, 0x14, 1 << 5);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1653
	mdio_patch(ioaddr, 0x0d, 1 << 5);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1654
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1655
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1656
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1657
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1658
static void rtl8168c_1_hw_phy_config(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1659
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1660
	static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1661
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1662
		{ 0x12, 0x2300 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1663
		{ 0x1f, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1664
		{ 0x00, 0x88d4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1665
		{ 0x01, 0x82b1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1666
		{ 0x03, 0x7002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1667
		{ 0x08, 0x9e30 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1668
		{ 0x09, 0x01f0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1669
		{ 0x0a, 0x5500 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1670
		{ 0x0c, 0x00c8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1671
		{ 0x1f, 0x0003 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1672
		{ 0x12, 0xc096 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1673
		{ 0x16, 0x000a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1674
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1675
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1676
		{ 0x09, 0x2000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1677
		{ 0x09, 0x0000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1678
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1679
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1680
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1681
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1682
	mdio_patch(ioaddr, 0x14, 1 << 5);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1683
	mdio_patch(ioaddr, 0x0d, 1 << 5);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1684
	mdio_write(ioaddr, 0x1f, 0x0000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1685
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1686
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1687
static void rtl8168c_2_hw_phy_config(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1688
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1689
	static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1690
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1691
		{ 0x12, 0x2300 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1692
		{ 0x03, 0x802f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1693
		{ 0x02, 0x4f02 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1694
		{ 0x01, 0x0409 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1695
		{ 0x00, 0xf099 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1696
		{ 0x04, 0x9800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1697
		{ 0x04, 0x9000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1698
		{ 0x1d, 0x3d98 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1699
		{ 0x1f, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1700
		{ 0x0c, 0x7eb8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1701
		{ 0x06, 0x0761 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1702
		{ 0x1f, 0x0003 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1703
		{ 0x16, 0x0f0a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1704
		{ 0x1f, 0x0000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1705
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1706
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1707
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1708
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1709
	mdio_patch(ioaddr, 0x16, 1 << 0);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1710
	mdio_patch(ioaddr, 0x14, 1 << 5);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1711
	mdio_patch(ioaddr, 0x0d, 1 << 5);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1712
	mdio_write(ioaddr, 0x1f, 0x0000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1713
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1714
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1715
static void rtl8168c_3_hw_phy_config(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1716
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1717
	static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1718
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1719
		{ 0x12, 0x2300 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1720
		{ 0x1d, 0x3d98 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1721
		{ 0x1f, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1722
		{ 0x0c, 0x7eb8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1723
		{ 0x06, 0x5461 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1724
		{ 0x1f, 0x0003 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1725
		{ 0x16, 0x0f0a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1726
		{ 0x1f, 0x0000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1727
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1728
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1729
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1730
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1731
	mdio_patch(ioaddr, 0x16, 1 << 0);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1732
	mdio_patch(ioaddr, 0x14, 1 << 5);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1733
	mdio_patch(ioaddr, 0x0d, 1 << 5);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1734
	mdio_write(ioaddr, 0x1f, 0x0000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1735
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1736
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1737
static void rtl8168c_4_hw_phy_config(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1738
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1739
	rtl8168c_3_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1740
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1741
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1742
static void rtl8168d_1_hw_phy_config(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1743
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1744
	static const struct phy_reg phy_reg_init_0[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1745
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1746
		{ 0x06, 0x4064 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1747
		{ 0x07, 0x2863 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1748
		{ 0x08, 0x059c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1749
		{ 0x09, 0x26b4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1750
		{ 0x0a, 0x6a19 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1751
		{ 0x0b, 0xdcc8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1752
		{ 0x10, 0xf06d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1753
		{ 0x14, 0x7f68 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1754
		{ 0x18, 0x7fd9 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1755
		{ 0x1c, 0xf0ff },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1756
		{ 0x1d, 0x3d9c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1757
		{ 0x1f, 0x0003 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1758
		{ 0x12, 0xf49f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1759
		{ 0x13, 0x070b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1760
		{ 0x1a, 0x05ad },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1761
		{ 0x14, 0x94c0 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1762
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1763
	static const struct phy_reg phy_reg_init_1[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1764
		{ 0x1f, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1765
		{ 0x06, 0x5561 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1766
		{ 0x1f, 0x0005 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1767
		{ 0x05, 0x8332 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1768
		{ 0x06, 0x5561 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1769
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1770
	static const struct phy_reg phy_reg_init_2[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1771
		{ 0x1f, 0x0005 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1772
		{ 0x05, 0xffc2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1773
		{ 0x1f, 0x0005 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1774
		{ 0x05, 0x8000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1775
		{ 0x06, 0xf8f9 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1776
		{ 0x06, 0xfaef },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1777
		{ 0x06, 0x59ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1778
		{ 0x06, 0xf8ea },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1779
		{ 0x06, 0x00ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1780
		{ 0x06, 0xf8eb },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1781
		{ 0x06, 0x00e0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1782
		{ 0x06, 0xf87c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1783
		{ 0x06, 0xe1f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1784
		{ 0x06, 0x7d59 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1785
		{ 0x06, 0x0fef },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1786
		{ 0x06, 0x0139 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1787
		{ 0x06, 0x029e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1788
		{ 0x06, 0x06ef },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1789
		{ 0x06, 0x1039 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1790
		{ 0x06, 0x089f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1791
		{ 0x06, 0x2aee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1792
		{ 0x06, 0xf8ea },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1793
		{ 0x06, 0x00ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1794
		{ 0x06, 0xf8eb },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1795
		{ 0x06, 0x01e0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1796
		{ 0x06, 0xf87c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1797
		{ 0x06, 0xe1f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1798
		{ 0x06, 0x7d58 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1799
		{ 0x06, 0x409e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1800
		{ 0x06, 0x0f39 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1801
		{ 0x06, 0x46aa },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1802
		{ 0x06, 0x0bbf },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1803
		{ 0x06, 0x8290 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1804
		{ 0x06, 0xd682 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1805
		{ 0x06, 0x9802 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1806
		{ 0x06, 0x014f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1807
		{ 0x06, 0xae09 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1808
		{ 0x06, 0xbf82 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1809
		{ 0x06, 0x98d6 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1810
		{ 0x06, 0x82a0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1811
		{ 0x06, 0x0201 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1812
		{ 0x06, 0x4fef },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1813
		{ 0x06, 0x95fe },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1814
		{ 0x06, 0xfdfc },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1815
		{ 0x06, 0x05f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1816
		{ 0x06, 0xf9fa },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1817
		{ 0x06, 0xeef8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1818
		{ 0x06, 0xea00 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1819
		{ 0x06, 0xeef8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1820
		{ 0x06, 0xeb00 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1821
		{ 0x06, 0xe2f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1822
		{ 0x06, 0x7ce3 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1823
		{ 0x06, 0xf87d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1824
		{ 0x06, 0xa511 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1825
		{ 0x06, 0x1112 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1826
		{ 0x06, 0xd240 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1827
		{ 0x06, 0xd644 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1828
		{ 0x06, 0x4402 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1829
		{ 0x06, 0x8217 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1830
		{ 0x06, 0xd2a0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1831
		{ 0x06, 0xd6aa },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1832
		{ 0x06, 0xaa02 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1833
		{ 0x06, 0x8217 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1834
		{ 0x06, 0xae0f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1835
		{ 0x06, 0xa544 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1836
		{ 0x06, 0x4402 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1837
		{ 0x06, 0xae4d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1838
		{ 0x06, 0xa5aa },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1839
		{ 0x06, 0xaa02 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1840
		{ 0x06, 0xae47 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1841
		{ 0x06, 0xaf82 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1842
		{ 0x06, 0x13ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1843
		{ 0x06, 0x834e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1844
		{ 0x06, 0x00ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1845
		{ 0x06, 0x834d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1846
		{ 0x06, 0x0fee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1847
		{ 0x06, 0x834c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1848
		{ 0x06, 0x0fee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1849
		{ 0x06, 0x834f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1850
		{ 0x06, 0x00ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1851
		{ 0x06, 0x8351 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1852
		{ 0x06, 0x00ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1853
		{ 0x06, 0x834a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1854
		{ 0x06, 0xffee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1855
		{ 0x06, 0x834b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1856
		{ 0x06, 0xffe0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1857
		{ 0x06, 0x8330 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1858
		{ 0x06, 0xe183 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1859
		{ 0x06, 0x3158 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1860
		{ 0x06, 0xfee4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1861
		{ 0x06, 0xf88a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1862
		{ 0x06, 0xe5f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1863
		{ 0x06, 0x8be0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1864
		{ 0x06, 0x8332 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1865
		{ 0x06, 0xe183 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1866
		{ 0x06, 0x3359 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1867
		{ 0x06, 0x0fe2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1868
		{ 0x06, 0x834d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1869
		{ 0x06, 0x0c24 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1870
		{ 0x06, 0x5af0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1871
		{ 0x06, 0x1e12 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1872
		{ 0x06, 0xe4f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1873
		{ 0x06, 0x8ce5 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1874
		{ 0x06, 0xf88d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1875
		{ 0x06, 0xaf82 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1876
		{ 0x06, 0x13e0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1877
		{ 0x06, 0x834f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1878
		{ 0x06, 0x10e4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1879
		{ 0x06, 0x834f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1880
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1881
		{ 0x06, 0x4e78 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1882
		{ 0x06, 0x009f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1883
		{ 0x06, 0x0ae0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1884
		{ 0x06, 0x834f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1885
		{ 0x06, 0xa010 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1886
		{ 0x06, 0xa5ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1887
		{ 0x06, 0x834e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1888
		{ 0x06, 0x01e0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1889
		{ 0x06, 0x834e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1890
		{ 0x06, 0x7805 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1891
		{ 0x06, 0x9e9a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1892
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1893
		{ 0x06, 0x4e78 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1894
		{ 0x06, 0x049e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1895
		{ 0x06, 0x10e0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1896
		{ 0x06, 0x834e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1897
		{ 0x06, 0x7803 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1898
		{ 0x06, 0x9e0f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1899
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1900
		{ 0x06, 0x4e78 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1901
		{ 0x06, 0x019e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1902
		{ 0x06, 0x05ae },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1903
		{ 0x06, 0x0caf },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1904
		{ 0x06, 0x81f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1905
		{ 0x06, 0xaf81 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1906
		{ 0x06, 0xa3af },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1907
		{ 0x06, 0x81dc },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1908
		{ 0x06, 0xaf82 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1909
		{ 0x06, 0x13ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1910
		{ 0x06, 0x8348 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1911
		{ 0x06, 0x00ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1912
		{ 0x06, 0x8349 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1913
		{ 0x06, 0x00e0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1914
		{ 0x06, 0x8351 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1915
		{ 0x06, 0x10e4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1916
		{ 0x06, 0x8351 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1917
		{ 0x06, 0x5801 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1918
		{ 0x06, 0x9fea },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1919
		{ 0x06, 0xd000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1920
		{ 0x06, 0xd180 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1921
		{ 0x06, 0x1f66 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1922
		{ 0x06, 0xe2f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1923
		{ 0x06, 0xeae3 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1924
		{ 0x06, 0xf8eb },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1925
		{ 0x06, 0x5af8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1926
		{ 0x06, 0x1e20 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1927
		{ 0x06, 0xe6f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1928
		{ 0x06, 0xeae5 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1929
		{ 0x06, 0xf8eb },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1930
		{ 0x06, 0xd302 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1931
		{ 0x06, 0xb3fe },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1932
		{ 0x06, 0xe2f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1933
		{ 0x06, 0x7cef },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1934
		{ 0x06, 0x325b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1935
		{ 0x06, 0x80e3 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1936
		{ 0x06, 0xf87d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1937
		{ 0x06, 0x9e03 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1938
		{ 0x06, 0x7dff },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1939
		{ 0x06, 0xff0d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1940
		{ 0x06, 0x581c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1941
		{ 0x06, 0x551a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1942
		{ 0x06, 0x6511 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1943
		{ 0x06, 0xa190 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1944
		{ 0x06, 0xd3e2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1945
		{ 0x06, 0x8348 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1946
		{ 0x06, 0xe383 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1947
		{ 0x06, 0x491b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1948
		{ 0x06, 0x56ab },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1949
		{ 0x06, 0x08ef },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1950
		{ 0x06, 0x56e6 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1951
		{ 0x06, 0x8348 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1952
		{ 0x06, 0xe783 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1953
		{ 0x06, 0x4910 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1954
		{ 0x06, 0xd180 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1955
		{ 0x06, 0x1f66 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1956
		{ 0x06, 0xa004 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1957
		{ 0x06, 0xb9e2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1958
		{ 0x06, 0x8348 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1959
		{ 0x06, 0xe383 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1960
		{ 0x06, 0x49ef },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1961
		{ 0x06, 0x65e2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1962
		{ 0x06, 0x834a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1963
		{ 0x06, 0xe383 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1964
		{ 0x06, 0x4b1b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1965
		{ 0x06, 0x56aa },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1966
		{ 0x06, 0x0eef },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1967
		{ 0x06, 0x56e6 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1968
		{ 0x06, 0x834a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1969
		{ 0x06, 0xe783 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1970
		{ 0x06, 0x4be2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1971
		{ 0x06, 0x834d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1972
		{ 0x06, 0xe683 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1973
		{ 0x06, 0x4ce0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1974
		{ 0x06, 0x834d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1975
		{ 0x06, 0xa000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1976
		{ 0x06, 0x0caf },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1977
		{ 0x06, 0x81dc },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1978
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1979
		{ 0x06, 0x4d10 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1980
		{ 0x06, 0xe483 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1981
		{ 0x06, 0x4dae },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1982
		{ 0x06, 0x0480 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1983
		{ 0x06, 0xe483 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1984
		{ 0x06, 0x4de0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1985
		{ 0x06, 0x834e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1986
		{ 0x06, 0x7803 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1987
		{ 0x06, 0x9e0b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1988
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1989
		{ 0x06, 0x4e78 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1990
		{ 0x06, 0x049e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1991
		{ 0x06, 0x04ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1992
		{ 0x06, 0x834e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1993
		{ 0x06, 0x02e0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1994
		{ 0x06, 0x8332 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1995
		{ 0x06, 0xe183 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1996
		{ 0x06, 0x3359 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1997
		{ 0x06, 0x0fe2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1998
		{ 0x06, 0x834d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1999
		{ 0x06, 0x0c24 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2000
		{ 0x06, 0x5af0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2001
		{ 0x06, 0x1e12 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2002
		{ 0x06, 0xe4f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2003
		{ 0x06, 0x8ce5 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2004
		{ 0x06, 0xf88d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2005
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2006
		{ 0x06, 0x30e1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2007
		{ 0x06, 0x8331 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2008
		{ 0x06, 0x6801 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2009
		{ 0x06, 0xe4f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2010
		{ 0x06, 0x8ae5 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2011
		{ 0x06, 0xf88b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2012
		{ 0x06, 0xae37 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2013
		{ 0x06, 0xee83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2014
		{ 0x06, 0x4e03 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2015
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2016
		{ 0x06, 0x4ce1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2017
		{ 0x06, 0x834d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2018
		{ 0x06, 0x1b01 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2019
		{ 0x06, 0x9e04 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2020
		{ 0x06, 0xaaa1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2021
		{ 0x06, 0xaea8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2022
		{ 0x06, 0xee83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2023
		{ 0x06, 0x4e04 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2024
		{ 0x06, 0xee83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2025
		{ 0x06, 0x4f00 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2026
		{ 0x06, 0xaeab },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2027
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2028
		{ 0x06, 0x4f78 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2029
		{ 0x06, 0x039f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2030
		{ 0x06, 0x14ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2031
		{ 0x06, 0x834e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2032
		{ 0x06, 0x05d2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2033
		{ 0x06, 0x40d6 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2034
		{ 0x06, 0x5554 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2035
		{ 0x06, 0x0282 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2036
		{ 0x06, 0x17d2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2037
		{ 0x06, 0xa0d6 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2038
		{ 0x06, 0xba00 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2039
		{ 0x06, 0x0282 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2040
		{ 0x06, 0x17fe },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2041
		{ 0x06, 0xfdfc },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2042
		{ 0x06, 0x05f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2043
		{ 0x06, 0xe0f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2044
		{ 0x06, 0x60e1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2045
		{ 0x06, 0xf861 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2046
		{ 0x06, 0x6802 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2047
		{ 0x06, 0xe4f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2048
		{ 0x06, 0x60e5 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2049
		{ 0x06, 0xf861 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2050
		{ 0x06, 0xe0f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2051
		{ 0x06, 0x48e1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2052
		{ 0x06, 0xf849 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2053
		{ 0x06, 0x580f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2054
		{ 0x06, 0x1e02 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2055
		{ 0x06, 0xe4f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2056
		{ 0x06, 0x48e5 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2057
		{ 0x06, 0xf849 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2058
		{ 0x06, 0xd000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2059
		{ 0x06, 0x0282 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2060
		{ 0x06, 0x5bbf },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2061
		{ 0x06, 0x8350 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2062
		{ 0x06, 0xef46 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2063
		{ 0x06, 0xdc19 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2064
		{ 0x06, 0xddd0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2065
		{ 0x06, 0x0102 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2066
		{ 0x06, 0x825b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2067
		{ 0x06, 0x0282 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2068
		{ 0x06, 0x77e0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2069
		{ 0x06, 0xf860 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2070
		{ 0x06, 0xe1f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2071
		{ 0x06, 0x6158 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2072
		{ 0x06, 0xfde4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2073
		{ 0x06, 0xf860 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2074
		{ 0x06, 0xe5f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2075
		{ 0x06, 0x61fc },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2076
		{ 0x06, 0x04f9 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2077
		{ 0x06, 0xfafb },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2078
		{ 0x06, 0xc6bf },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2079
		{ 0x06, 0xf840 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2080
		{ 0x06, 0xbe83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2081
		{ 0x06, 0x50a0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2082
		{ 0x06, 0x0101 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2083
		{ 0x06, 0x071b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2084
		{ 0x06, 0x89cf },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2085
		{ 0x06, 0xd208 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2086
		{ 0x06, 0xebdb },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2087
		{ 0x06, 0x19b2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2088
		{ 0x06, 0xfbff },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2089
		{ 0x06, 0xfefd },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2090
		{ 0x06, 0x04f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2091
		{ 0x06, 0xe0f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2092
		{ 0x06, 0x48e1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2093
		{ 0x06, 0xf849 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2094
		{ 0x06, 0x6808 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2095
		{ 0x06, 0xe4f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2096
		{ 0x06, 0x48e5 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2097
		{ 0x06, 0xf849 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2098
		{ 0x06, 0x58f7 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2099
		{ 0x06, 0xe4f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2100
		{ 0x06, 0x48e5 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2101
		{ 0x06, 0xf849 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2102
		{ 0x06, 0xfc04 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2103
		{ 0x06, 0x4d20 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2104
		{ 0x06, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2105
		{ 0x06, 0x4e22 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2106
		{ 0x06, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2107
		{ 0x06, 0x4ddf },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2108
		{ 0x06, 0xff01 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2109
		{ 0x06, 0x4edd },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2110
		{ 0x06, 0xff01 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2111
		{ 0x05, 0x83d4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2112
		{ 0x06, 0x8000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2113
		{ 0x05, 0x83d8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2114
		{ 0x06, 0x8051 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2115
		{ 0x02, 0x6010 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2116
		{ 0x03, 0xdc00 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2117
		{ 0x05, 0xfff6 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2118
		{ 0x06, 0x00fc },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2119
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2120
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2121
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2122
		{ 0x0d, 0xf880 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2123
		{ 0x1f, 0x0000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2124
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2125
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2126
	rtl_phy_write(ioaddr, phy_reg_init_0, ARRAY_SIZE(phy_reg_init_0));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2127
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2128
	mdio_write(ioaddr, 0x1f, 0x0002);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2129
	mdio_plus_minus(ioaddr, 0x0b, 0x0010, 0x00ef);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2130
	mdio_plus_minus(ioaddr, 0x0c, 0xa200, 0x5d00);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2131
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2132
	rtl_phy_write(ioaddr, phy_reg_init_1, ARRAY_SIZE(phy_reg_init_1));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2133
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2134
	if (rtl8168d_efuse_read(ioaddr, 0x01) == 0xb1) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2135
		static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2136
			{ 0x1f, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2137
			{ 0x05, 0x669a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2138
			{ 0x1f, 0x0005 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2139
			{ 0x05, 0x8330 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2140
			{ 0x06, 0x669a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2141
			{ 0x1f, 0x0002 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2142
		};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2143
		int val;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2144
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2145
		rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2146
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2147
		val = mdio_read(ioaddr, 0x0d);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2148
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2149
		if ((val & 0x00ff) != 0x006c) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2150
			static const u32 set[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2151
				0x0065, 0x0066, 0x0067, 0x0068,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2152
				0x0069, 0x006a, 0x006b, 0x006c
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2153
			};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2154
			int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2155
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2156
			mdio_write(ioaddr, 0x1f, 0x0002);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2157
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2158
			val &= 0xff00;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2159
			for (i = 0; i < ARRAY_SIZE(set); i++)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2160
				mdio_write(ioaddr, 0x0d, val | set[i]);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2161
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2162
	} else {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2163
		static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2164
			{ 0x1f, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2165
			{ 0x05, 0x6662 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2166
			{ 0x1f, 0x0005 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2167
			{ 0x05, 0x8330 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2168
			{ 0x06, 0x6662 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2169
		};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2170
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2171
		rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2172
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2173
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2174
	mdio_write(ioaddr, 0x1f, 0x0002);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2175
	mdio_patch(ioaddr, 0x0d, 0x0300);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2176
	mdio_patch(ioaddr, 0x0f, 0x0010);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2177
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2178
	mdio_write(ioaddr, 0x1f, 0x0002);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2179
	mdio_plus_minus(ioaddr, 0x02, 0x0100, 0x0600);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2180
	mdio_plus_minus(ioaddr, 0x03, 0x0000, 0xe000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2181
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2182
	rtl_phy_write(ioaddr, phy_reg_init_2, ARRAY_SIZE(phy_reg_init_2));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2183
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2184
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2185
static void rtl8168d_2_hw_phy_config(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2186
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2187
	static const struct phy_reg phy_reg_init_0[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2188
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2189
		{ 0x06, 0x4064 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2190
		{ 0x07, 0x2863 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2191
		{ 0x08, 0x059c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2192
		{ 0x09, 0x26b4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2193
		{ 0x0a, 0x6a19 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2194
		{ 0x0b, 0xdcc8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2195
		{ 0x10, 0xf06d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2196
		{ 0x14, 0x7f68 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2197
		{ 0x18, 0x7fd9 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2198
		{ 0x1c, 0xf0ff },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2199
		{ 0x1d, 0x3d9c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2200
		{ 0x1f, 0x0003 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2201
		{ 0x12, 0xf49f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2202
		{ 0x13, 0x070b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2203
		{ 0x1a, 0x05ad },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2204
		{ 0x14, 0x94c0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2205
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2206
		{ 0x1f, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2207
		{ 0x06, 0x5561 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2208
		{ 0x1f, 0x0005 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2209
		{ 0x05, 0x8332 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2210
		{ 0x06, 0x5561 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2211
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2212
	static const struct phy_reg phy_reg_init_1[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2213
		{ 0x1f, 0x0005 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2214
		{ 0x05, 0xffc2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2215
		{ 0x1f, 0x0005 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2216
		{ 0x05, 0x8000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2217
		{ 0x06, 0xf8f9 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2218
		{ 0x06, 0xfaee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2219
		{ 0x06, 0xf8ea },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2220
		{ 0x06, 0x00ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2221
		{ 0x06, 0xf8eb },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2222
		{ 0x06, 0x00e2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2223
		{ 0x06, 0xf87c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2224
		{ 0x06, 0xe3f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2225
		{ 0x06, 0x7da5 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2226
		{ 0x06, 0x1111 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2227
		{ 0x06, 0x12d2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2228
		{ 0x06, 0x40d6 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2229
		{ 0x06, 0x4444 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2230
		{ 0x06, 0x0281 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2231
		{ 0x06, 0xc6d2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2232
		{ 0x06, 0xa0d6 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2233
		{ 0x06, 0xaaaa },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2234
		{ 0x06, 0x0281 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2235
		{ 0x06, 0xc6ae },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2236
		{ 0x06, 0x0fa5 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2237
		{ 0x06, 0x4444 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2238
		{ 0x06, 0x02ae },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2239
		{ 0x06, 0x4da5 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2240
		{ 0x06, 0xaaaa },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2241
		{ 0x06, 0x02ae },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2242
		{ 0x06, 0x47af },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2243
		{ 0x06, 0x81c2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2244
		{ 0x06, 0xee83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2245
		{ 0x06, 0x4e00 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2246
		{ 0x06, 0xee83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2247
		{ 0x06, 0x4d0f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2248
		{ 0x06, 0xee83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2249
		{ 0x06, 0x4c0f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2250
		{ 0x06, 0xee83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2251
		{ 0x06, 0x4f00 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2252
		{ 0x06, 0xee83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2253
		{ 0x06, 0x5100 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2254
		{ 0x06, 0xee83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2255
		{ 0x06, 0x4aff },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2256
		{ 0x06, 0xee83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2257
		{ 0x06, 0x4bff },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2258
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2259
		{ 0x06, 0x30e1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2260
		{ 0x06, 0x8331 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2261
		{ 0x06, 0x58fe },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2262
		{ 0x06, 0xe4f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2263
		{ 0x06, 0x8ae5 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2264
		{ 0x06, 0xf88b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2265
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2266
		{ 0x06, 0x32e1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2267
		{ 0x06, 0x8333 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2268
		{ 0x06, 0x590f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2269
		{ 0x06, 0xe283 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2270
		{ 0x06, 0x4d0c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2271
		{ 0x06, 0x245a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2272
		{ 0x06, 0xf01e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2273
		{ 0x06, 0x12e4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2274
		{ 0x06, 0xf88c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2275
		{ 0x06, 0xe5f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2276
		{ 0x06, 0x8daf },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2277
		{ 0x06, 0x81c2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2278
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2279
		{ 0x06, 0x4f10 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2280
		{ 0x06, 0xe483 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2281
		{ 0x06, 0x4fe0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2282
		{ 0x06, 0x834e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2283
		{ 0x06, 0x7800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2284
		{ 0x06, 0x9f0a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2285
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2286
		{ 0x06, 0x4fa0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2287
		{ 0x06, 0x10a5 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2288
		{ 0x06, 0xee83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2289
		{ 0x06, 0x4e01 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2290
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2291
		{ 0x06, 0x4e78 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2292
		{ 0x06, 0x059e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2293
		{ 0x06, 0x9ae0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2294
		{ 0x06, 0x834e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2295
		{ 0x06, 0x7804 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2296
		{ 0x06, 0x9e10 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2297
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2298
		{ 0x06, 0x4e78 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2299
		{ 0x06, 0x039e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2300
		{ 0x06, 0x0fe0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2301
		{ 0x06, 0x834e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2302
		{ 0x06, 0x7801 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2303
		{ 0x06, 0x9e05 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2304
		{ 0x06, 0xae0c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2305
		{ 0x06, 0xaf81 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2306
		{ 0x06, 0xa7af },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2307
		{ 0x06, 0x8152 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2308
		{ 0x06, 0xaf81 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2309
		{ 0x06, 0x8baf },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2310
		{ 0x06, 0x81c2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2311
		{ 0x06, 0xee83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2312
		{ 0x06, 0x4800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2313
		{ 0x06, 0xee83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2314
		{ 0x06, 0x4900 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2315
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2316
		{ 0x06, 0x5110 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2317
		{ 0x06, 0xe483 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2318
		{ 0x06, 0x5158 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2319
		{ 0x06, 0x019f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2320
		{ 0x06, 0xead0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2321
		{ 0x06, 0x00d1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2322
		{ 0x06, 0x801f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2323
		{ 0x06, 0x66e2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2324
		{ 0x06, 0xf8ea },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2325
		{ 0x06, 0xe3f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2326
		{ 0x06, 0xeb5a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2327
		{ 0x06, 0xf81e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2328
		{ 0x06, 0x20e6 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2329
		{ 0x06, 0xf8ea },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2330
		{ 0x06, 0xe5f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2331
		{ 0x06, 0xebd3 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2332
		{ 0x06, 0x02b3 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2333
		{ 0x06, 0xfee2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2334
		{ 0x06, 0xf87c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2335
		{ 0x06, 0xef32 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2336
		{ 0x06, 0x5b80 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2337
		{ 0x06, 0xe3f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2338
		{ 0x06, 0x7d9e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2339
		{ 0x06, 0x037d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2340
		{ 0x06, 0xffff },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2341
		{ 0x06, 0x0d58 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2342
		{ 0x06, 0x1c55 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2343
		{ 0x06, 0x1a65 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2344
		{ 0x06, 0x11a1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2345
		{ 0x06, 0x90d3 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2346
		{ 0x06, 0xe283 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2347
		{ 0x06, 0x48e3 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2348
		{ 0x06, 0x8349 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2349
		{ 0x06, 0x1b56 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2350
		{ 0x06, 0xab08 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2351
		{ 0x06, 0xef56 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2352
		{ 0x06, 0xe683 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2353
		{ 0x06, 0x48e7 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2354
		{ 0x06, 0x8349 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2355
		{ 0x06, 0x10d1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2356
		{ 0x06, 0x801f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2357
		{ 0x06, 0x66a0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2358
		{ 0x06, 0x04b9 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2359
		{ 0x06, 0xe283 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2360
		{ 0x06, 0x48e3 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2361
		{ 0x06, 0x8349 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2362
		{ 0x06, 0xef65 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2363
		{ 0x06, 0xe283 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2364
		{ 0x06, 0x4ae3 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2365
		{ 0x06, 0x834b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2366
		{ 0x06, 0x1b56 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2367
		{ 0x06, 0xaa0e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2368
		{ 0x06, 0xef56 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2369
		{ 0x06, 0xe683 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2370
		{ 0x06, 0x4ae7 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2371
		{ 0x06, 0x834b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2372
		{ 0x06, 0xe283 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2373
		{ 0x06, 0x4de6 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2374
		{ 0x06, 0x834c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2375
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2376
		{ 0x06, 0x4da0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2377
		{ 0x06, 0x000c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2378
		{ 0x06, 0xaf81 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2379
		{ 0x06, 0x8be0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2380
		{ 0x06, 0x834d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2381
		{ 0x06, 0x10e4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2382
		{ 0x06, 0x834d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2383
		{ 0x06, 0xae04 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2384
		{ 0x06, 0x80e4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2385
		{ 0x06, 0x834d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2386
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2387
		{ 0x06, 0x4e78 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2388
		{ 0x06, 0x039e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2389
		{ 0x06, 0x0be0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2390
		{ 0x06, 0x834e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2391
		{ 0x06, 0x7804 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2392
		{ 0x06, 0x9e04 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2393
		{ 0x06, 0xee83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2394
		{ 0x06, 0x4e02 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2395
		{ 0x06, 0xe083 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2396
		{ 0x06, 0x32e1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2397
		{ 0x06, 0x8333 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2398
		{ 0x06, 0x590f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2399
		{ 0x06, 0xe283 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2400
		{ 0x06, 0x4d0c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2401
		{ 0x06, 0x245a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2402
		{ 0x06, 0xf01e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2403
		{ 0x06, 0x12e4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2404
		{ 0x06, 0xf88c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2405
		{ 0x06, 0xe5f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2406
		{ 0x06, 0x8de0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2407
		{ 0x06, 0x8330 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2408
		{ 0x06, 0xe183 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2409
		{ 0x06, 0x3168 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2410
		{ 0x06, 0x01e4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2411
		{ 0x06, 0xf88a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2412
		{ 0x06, 0xe5f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2413
		{ 0x06, 0x8bae },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2414
		{ 0x06, 0x37ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2415
		{ 0x06, 0x834e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2416
		{ 0x06, 0x03e0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2417
		{ 0x06, 0x834c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2418
		{ 0x06, 0xe183 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2419
		{ 0x06, 0x4d1b },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2420
		{ 0x06, 0x019e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2421
		{ 0x06, 0x04aa },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2422
		{ 0x06, 0xa1ae },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2423
		{ 0x06, 0xa8ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2424
		{ 0x06, 0x834e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2425
		{ 0x06, 0x04ee },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2426
		{ 0x06, 0x834f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2427
		{ 0x06, 0x00ae },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2428
		{ 0x06, 0xabe0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2429
		{ 0x06, 0x834f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2430
		{ 0x06, 0x7803 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2431
		{ 0x06, 0x9f14 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2432
		{ 0x06, 0xee83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2433
		{ 0x06, 0x4e05 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2434
		{ 0x06, 0xd240 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2435
		{ 0x06, 0xd655 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2436
		{ 0x06, 0x5402 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2437
		{ 0x06, 0x81c6 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2438
		{ 0x06, 0xd2a0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2439
		{ 0x06, 0xd6ba },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2440
		{ 0x06, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2441
		{ 0x06, 0x81c6 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2442
		{ 0x06, 0xfefd },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2443
		{ 0x06, 0xfc05 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2444
		{ 0x06, 0xf8e0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2445
		{ 0x06, 0xf860 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2446
		{ 0x06, 0xe1f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2447
		{ 0x06, 0x6168 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2448
		{ 0x06, 0x02e4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2449
		{ 0x06, 0xf860 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2450
		{ 0x06, 0xe5f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2451
		{ 0x06, 0x61e0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2452
		{ 0x06, 0xf848 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2453
		{ 0x06, 0xe1f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2454
		{ 0x06, 0x4958 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2455
		{ 0x06, 0x0f1e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2456
		{ 0x06, 0x02e4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2457
		{ 0x06, 0xf848 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2458
		{ 0x06, 0xe5f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2459
		{ 0x06, 0x49d0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2460
		{ 0x06, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2461
		{ 0x06, 0x820a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2462
		{ 0x06, 0xbf83 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2463
		{ 0x06, 0x50ef },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2464
		{ 0x06, 0x46dc },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2465
		{ 0x06, 0x19dd },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2466
		{ 0x06, 0xd001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2467
		{ 0x06, 0x0282 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2468
		{ 0x06, 0x0a02 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2469
		{ 0x06, 0x8226 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2470
		{ 0x06, 0xe0f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2471
		{ 0x06, 0x60e1 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2472
		{ 0x06, 0xf861 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2473
		{ 0x06, 0x58fd },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2474
		{ 0x06, 0xe4f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2475
		{ 0x06, 0x60e5 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2476
		{ 0x06, 0xf861 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2477
		{ 0x06, 0xfc04 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2478
		{ 0x06, 0xf9fa },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2479
		{ 0x06, 0xfbc6 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2480
		{ 0x06, 0xbff8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2481
		{ 0x06, 0x40be },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2482
		{ 0x06, 0x8350 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2483
		{ 0x06, 0xa001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2484
		{ 0x06, 0x0107 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2485
		{ 0x06, 0x1b89 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2486
		{ 0x06, 0xcfd2 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2487
		{ 0x06, 0x08eb },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2488
		{ 0x06, 0xdb19 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2489
		{ 0x06, 0xb2fb },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2490
		{ 0x06, 0xfffe },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2491
		{ 0x06, 0xfd04 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2492
		{ 0x06, 0xf8e0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2493
		{ 0x06, 0xf848 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2494
		{ 0x06, 0xe1f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2495
		{ 0x06, 0x4968 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2496
		{ 0x06, 0x08e4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2497
		{ 0x06, 0xf848 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2498
		{ 0x06, 0xe5f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2499
		{ 0x06, 0x4958 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2500
		{ 0x06, 0xf7e4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2501
		{ 0x06, 0xf848 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2502
		{ 0x06, 0xe5f8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2503
		{ 0x06, 0x49fc },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2504
		{ 0x06, 0x044d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2505
		{ 0x06, 0x2000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2506
		{ 0x06, 0x024e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2507
		{ 0x06, 0x2200 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2508
		{ 0x06, 0x024d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2509
		{ 0x06, 0xdfff },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2510
		{ 0x06, 0x014e },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2511
		{ 0x06, 0xddff },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2512
		{ 0x06, 0x0100 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2513
		{ 0x05, 0x83d8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2514
		{ 0x06, 0x8000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2515
		{ 0x03, 0xdc00 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2516
		{ 0x05, 0xfff6 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2517
		{ 0x06, 0x00fc },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2518
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2519
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2520
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2521
		{ 0x0d, 0xf880 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2522
		{ 0x1f, 0x0000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2523
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2524
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2525
	rtl_phy_write(ioaddr, phy_reg_init_0, ARRAY_SIZE(phy_reg_init_0));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2526
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2527
	if (rtl8168d_efuse_read(ioaddr, 0x01) == 0xb1) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2528
		static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2529
			{ 0x1f, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2530
			{ 0x05, 0x669a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2531
			{ 0x1f, 0x0005 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2532
			{ 0x05, 0x8330 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2533
			{ 0x06, 0x669a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2534
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2535
			{ 0x1f, 0x0002 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2536
		};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2537
		int val;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2538
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2539
		rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2540
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2541
		val = mdio_read(ioaddr, 0x0d);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2542
		if ((val & 0x00ff) != 0x006c) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2543
			u32 set[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2544
				0x0065, 0x0066, 0x0067, 0x0068,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2545
				0x0069, 0x006a, 0x006b, 0x006c
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2546
			};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2547
			int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2548
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2549
			mdio_write(ioaddr, 0x1f, 0x0002);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2550
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2551
			val &= 0xff00;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2552
			for (i = 0; i < ARRAY_SIZE(set); i++)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2553
				mdio_write(ioaddr, 0x0d, val | set[i]);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2554
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2555
	} else {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2556
		static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2557
			{ 0x1f, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2558
			{ 0x05, 0x2642 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2559
			{ 0x1f, 0x0005 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2560
			{ 0x05, 0x8330 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2561
			{ 0x06, 0x2642 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2562
		};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2563
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2564
		rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2565
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2566
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2567
	mdio_write(ioaddr, 0x1f, 0x0002);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2568
	mdio_plus_minus(ioaddr, 0x02, 0x0100, 0x0600);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2569
	mdio_plus_minus(ioaddr, 0x03, 0x0000, 0xe000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2570
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2571
	mdio_write(ioaddr, 0x1f, 0x0001);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2572
	mdio_write(ioaddr, 0x17, 0x0cc0);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2573
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2574
	mdio_write(ioaddr, 0x1f, 0x0002);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2575
	mdio_patch(ioaddr, 0x0f, 0x0017);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2576
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2577
	rtl_phy_write(ioaddr, phy_reg_init_1, ARRAY_SIZE(phy_reg_init_1));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2578
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2579
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2580
static void rtl8168d_3_hw_phy_config(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2581
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2582
	static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2583
		{ 0x1f, 0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2584
		{ 0x10, 0x0008 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2585
		{ 0x0d, 0x006c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2586
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2587
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2588
		{ 0x0d, 0xf880 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2589
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2590
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2591
		{ 0x17, 0x0cc0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2592
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2593
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2594
		{ 0x0b, 0xa4d8 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2595
		{ 0x09, 0x281c },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2596
		{ 0x07, 0x2883 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2597
		{ 0x0a, 0x6b35 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2598
		{ 0x1d, 0x3da4 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2599
		{ 0x1c, 0xeffd },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2600
		{ 0x14, 0x7f52 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2601
		{ 0x18, 0x7fc6 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2602
		{ 0x08, 0x0601 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2603
		{ 0x06, 0x4063 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2604
		{ 0x10, 0xf074 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2605
		{ 0x1f, 0x0003 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2606
		{ 0x13, 0x0789 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2607
		{ 0x12, 0xf4bd },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2608
		{ 0x1a, 0x04fd },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2609
		{ 0x14, 0x84b0 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2610
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2611
		{ 0x00, 0x9200 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2612
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2613
		{ 0x1f, 0x0005 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2614
		{ 0x01, 0x0340 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2615
		{ 0x1f, 0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2616
		{ 0x04, 0x4000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2617
		{ 0x03, 0x1d21 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2618
		{ 0x02, 0x0c32 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2619
		{ 0x01, 0x0200 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2620
		{ 0x00, 0x5554 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2621
		{ 0x04, 0x4800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2622
		{ 0x04, 0x4000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2623
		{ 0x04, 0xf000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2624
		{ 0x03, 0xdf01 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2625
		{ 0x02, 0xdf20 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2626
		{ 0x01, 0x101a },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2627
		{ 0x00, 0xa0ff },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2628
		{ 0x04, 0xf800 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2629
		{ 0x04, 0xf000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2630
		{ 0x1f, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2631
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2632
		{ 0x1f, 0x0007 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2633
		{ 0x1e, 0x0023 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2634
		{ 0x16, 0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2635
		{ 0x1f, 0x0000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2636
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2637
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2638
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2639
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2640
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2641
static void rtl8102e_hw_phy_config(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2642
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2643
	static const struct phy_reg phy_reg_init[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2644
		{ 0x1f, 0x0003 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2645
		{ 0x08, 0x441d },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2646
		{ 0x01, 0x9100 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2647
		{ 0x1f, 0x0000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2648
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2649
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2650
	mdio_write(ioaddr, 0x1f, 0x0000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2651
	mdio_patch(ioaddr, 0x11, 1 << 12);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2652
	mdio_patch(ioaddr, 0x19, 1 << 13);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2653
	mdio_patch(ioaddr, 0x10, 1 << 15);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2654
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2655
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2656
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2657
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2658
static void rtl_hw_phy_config(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2659
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2660
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2661
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2662
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2663
	rtl8169_print_mac_version(tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2664
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2665
	switch (tp->mac_version) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2666
	case RTL_GIGA_MAC_VER_01:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2667
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2668
	case RTL_GIGA_MAC_VER_02:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2669
	case RTL_GIGA_MAC_VER_03:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2670
		rtl8169s_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2671
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2672
	case RTL_GIGA_MAC_VER_04:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2673
		rtl8169sb_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2674
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2675
	case RTL_GIGA_MAC_VER_05:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2676
		rtl8169scd_hw_phy_config(tp, ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2677
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2678
	case RTL_GIGA_MAC_VER_06:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2679
		rtl8169sce_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2680
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2681
	case RTL_GIGA_MAC_VER_07:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2682
	case RTL_GIGA_MAC_VER_08:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2683
	case RTL_GIGA_MAC_VER_09:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2684
		rtl8102e_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2685
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2686
	case RTL_GIGA_MAC_VER_11:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2687
		rtl8168bb_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2688
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2689
	case RTL_GIGA_MAC_VER_12:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2690
		rtl8168bef_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2691
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2692
	case RTL_GIGA_MAC_VER_17:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2693
		rtl8168bef_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2694
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2695
	case RTL_GIGA_MAC_VER_18:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2696
		rtl8168cp_1_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2697
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2698
	case RTL_GIGA_MAC_VER_19:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2699
		rtl8168c_1_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2700
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2701
	case RTL_GIGA_MAC_VER_20:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2702
		rtl8168c_2_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2703
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2704
	case RTL_GIGA_MAC_VER_21:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2705
		rtl8168c_3_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2706
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2707
	case RTL_GIGA_MAC_VER_22:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2708
		rtl8168c_4_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2709
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2710
	case RTL_GIGA_MAC_VER_23:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2711
	case RTL_GIGA_MAC_VER_24:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2712
		rtl8168cp_2_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2713
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2714
	case RTL_GIGA_MAC_VER_25:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2715
		rtl8168d_1_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2716
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2717
	case RTL_GIGA_MAC_VER_26:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2718
		rtl8168d_2_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2719
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2720
	case RTL_GIGA_MAC_VER_27:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2721
		rtl8168d_3_hw_phy_config(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2722
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2723
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2724
	default:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2725
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2726
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2727
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2728
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2729
static void rtl8169_phy_timer(unsigned long __opaque)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2730
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2731
	struct net_device *dev = (struct net_device *)__opaque;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2732
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2733
	struct timer_list *timer = &tp->timer;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2734
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2735
	unsigned long timeout = RTL8169_PHY_TIMEOUT;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2736
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2737
	assert(tp->mac_version > RTL_GIGA_MAC_VER_01);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2738
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2739
	if (!(tp->phy_1000_ctrl_reg & ADVERTISE_1000FULL))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2740
		return;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2741
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2742
	if (!tp->ecdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2743
		spin_lock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2744
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2745
	if (tp->phy_reset_pending(ioaddr)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2746
		/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2747
		 * A busy loop could burn quite a few cycles on nowadays CPU.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2748
		 * Let's delay the execution of the timer for a few ticks.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2749
		 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2750
		timeout = HZ/10;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2751
		goto out_mod_timer;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2752
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2753
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2754
	if (tp->link_ok(ioaddr))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2755
		goto out_unlock;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2756
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2757
	netif_warn(tp, link, dev, "PHY reset until link up\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2758
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2759
	tp->phy_reset_enable(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2760
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2761
out_mod_timer:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2762
	if (!tp->ecdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2763
		mod_timer(timer, jiffies + timeout);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2764
out_unlock:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2765
	if (!tp->ecdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2766
		spin_unlock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2767
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2768
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2769
static inline void rtl8169_delete_timer(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2770
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2771
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2772
	struct timer_list *timer = &tp->timer;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2773
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2774
	if (tp->ecdev || tp->mac_version <= RTL_GIGA_MAC_VER_01)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2775
		return;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2776
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2777
	del_timer_sync(timer);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2778
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2779
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2780
static inline void rtl8169_request_timer(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2781
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2782
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2783
	struct timer_list *timer = &tp->timer;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2784
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2785
	if (tp->ecdev || tp->mac_version <= RTL_GIGA_MAC_VER_01)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2786
		return;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2787
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2788
	mod_timer(timer, jiffies + RTL8169_PHY_TIMEOUT);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2789
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2790
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2791
#ifdef CONFIG_NET_POLL_CONTROLLER
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2792
/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2793
 * Polling 'interrupt' - used by things like netconsole to send skbs
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2794
 * without having to re-enable interrupts. It's not called while
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2795
 * the interrupt routine is executing.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2796
 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2797
static void rtl8169_netpoll(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2798
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2799
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2800
	struct pci_dev *pdev = tp->pci_dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2801
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2802
	disable_irq(pdev->irq);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2803
	rtl8169_interrupt(pdev->irq, dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2804
	enable_irq(pdev->irq);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2805
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2806
#endif
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2807
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2808
static void rtl8169_release_board(struct pci_dev *pdev, struct net_device *dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2809
				  void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2810
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2811
	iounmap(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2812
	pci_release_regions(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2813
	pci_clear_mwi(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2814
	pci_disable_device(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2815
	free_netdev(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2816
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2817
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2818
static void rtl8169_phy_reset(struct net_device *dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2819
			      struct rtl8169_private *tp)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2820
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2821
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2822
	unsigned int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2823
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2824
	tp->phy_reset_enable(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2825
	for (i = 0; i < 100; i++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2826
		if (!tp->phy_reset_pending(ioaddr))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2827
			return;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2828
		msleep(1);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2829
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2830
	netif_err(tp, link, dev, "PHY reset failed\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2831
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2832
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2833
static void rtl8169_init_phy(struct net_device *dev, struct rtl8169_private *tp)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2834
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2835
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2836
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2837
	rtl_hw_phy_config(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2838
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2839
	if (tp->mac_version <= RTL_GIGA_MAC_VER_06) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2840
		dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2841
		RTL_W8(0x82, 0x01);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2842
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2843
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2844
	pci_write_config_byte(tp->pci_dev, PCI_LATENCY_TIMER, 0x40);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2845
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2846
	if (tp->mac_version <= RTL_GIGA_MAC_VER_06)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2847
		pci_write_config_byte(tp->pci_dev, PCI_CACHE_LINE_SIZE, 0x08);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2848
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2849
	if (tp->mac_version == RTL_GIGA_MAC_VER_02) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2850
		dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2851
		RTL_W8(0x82, 0x01);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2852
		dprintk("Set PHY Reg 0x0bh = 0x00h\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2853
		mdio_write(ioaddr, 0x0b, 0x0000); //w 0x0b 15 0 0
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2854
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2855
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2856
	rtl8169_phy_reset(dev, tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2857
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2858
	/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2859
	 * rtl8169_set_speed_xmii takes good care of the Fast Ethernet
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2860
	 * only 8101. Don't panic.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2861
	 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2862
	rtl8169_set_speed(dev, AUTONEG_ENABLE, SPEED_1000, DUPLEX_FULL);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2863
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2864
	if (RTL_R8(PHYstatus) & TBI_Enable)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2865
		netif_info(tp, link, dev, "TBI auto-negotiating\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2866
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2867
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2868
static void rtl_rar_set(struct rtl8169_private *tp, u8 *addr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2869
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2870
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2871
	u32 high;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2872
	u32 low;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2873
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2874
	low  = addr[0] | (addr[1] << 8) | (addr[2] << 16) | (addr[3] << 24);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2875
	high = addr[4] | (addr[5] << 8);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2876
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2877
	spin_lock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2878
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2879
	RTL_W8(Cfg9346, Cfg9346_Unlock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2880
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2881
	RTL_W32(MAC4, high);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2882
	RTL_R32(MAC4);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2883
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2884
	RTL_W32(MAC0, low);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2885
	RTL_R32(MAC0);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2886
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2887
	RTL_W8(Cfg9346, Cfg9346_Lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2888
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2889
	spin_unlock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2890
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2891
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2892
static int rtl_set_mac_address(struct net_device *dev, void *p)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2893
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2894
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2895
	struct sockaddr *addr = p;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2896
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2897
	if (!is_valid_ether_addr(addr->sa_data))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2898
		return -EADDRNOTAVAIL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2899
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2900
	memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2901
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2902
	rtl_rar_set(tp, dev->dev_addr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2903
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2904
	return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2905
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2906
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2907
static int rtl8169_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2908
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2909
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2910
	struct mii_ioctl_data *data = if_mii(ifr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2911
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2912
	return netif_running(dev) ? tp->do_ioctl(tp, data, cmd) : -ENODEV;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2913
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2914
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2915
static int rtl_xmii_ioctl(struct rtl8169_private *tp, struct mii_ioctl_data *data, int cmd)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2916
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2917
	switch (cmd) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2918
	case SIOCGMIIPHY:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2919
		data->phy_id = 32; /* Internal PHY */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2920
		return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2921
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2922
	case SIOCGMIIREG:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2923
		data->val_out = mdio_read(tp->mmio_addr, data->reg_num & 0x1f);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2924
		return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2925
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2926
	case SIOCSMIIREG:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2927
		mdio_write(tp->mmio_addr, data->reg_num & 0x1f, data->val_in);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2928
		return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2929
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2930
	return -EOPNOTSUPP;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2931
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2932
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2933
static int rtl_tbi_ioctl(struct rtl8169_private *tp, struct mii_ioctl_data *data, int cmd)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2934
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2935
	return -EOPNOTSUPP;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2936
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2937
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2938
static const struct rtl_cfg_info {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2939
	void (*hw_start)(struct net_device *);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2940
	unsigned int region;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2941
	unsigned int align;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2942
	u16 intr_event;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2943
	u16 napi_event;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2944
	unsigned features;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2945
	u8 default_ver;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2946
} rtl_cfg_infos [] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2947
	[RTL_CFG_0] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2948
		.hw_start	= rtl_hw_start_8169,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2949
		.region		= 1,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2950
		.align		= 0,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2951
		.intr_event	= SYSErr | LinkChg | RxOverflow |
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2952
				  RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2953
		.napi_event	= RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2954
		.features	= RTL_FEATURE_GMII,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2955
		.default_ver	= RTL_GIGA_MAC_VER_01,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2956
	},
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2957
	[RTL_CFG_1] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2958
		.hw_start	= rtl_hw_start_8168,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2959
		.region		= 2,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2960
		.align		= 8,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2961
		.intr_event	= SYSErr | LinkChg | RxOverflow |
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2962
				  TxErr | TxOK | RxOK | RxErr,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2963
		.napi_event	= TxErr | TxOK | RxOK | RxOverflow,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2964
		.features	= RTL_FEATURE_GMII | RTL_FEATURE_MSI,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2965
		.default_ver	= RTL_GIGA_MAC_VER_11,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2966
	},
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2967
	[RTL_CFG_2] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2968
		.hw_start	= rtl_hw_start_8101,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2969
		.region		= 2,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2970
		.align		= 8,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2971
		.intr_event	= SYSErr | LinkChg | RxOverflow | PCSTimeout |
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2972
				  RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2973
		.napi_event	= RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2974
		.features	= RTL_FEATURE_MSI,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2975
		.default_ver	= RTL_GIGA_MAC_VER_13,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2976
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2977
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2978
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2979
/* Cfg9346_Unlock assumed. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2980
static unsigned rtl_try_msi(struct pci_dev *pdev, void __iomem *ioaddr,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2981
			    const struct rtl_cfg_info *cfg)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2982
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2983
	unsigned msi = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2984
	u8 cfg2;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2985
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2986
	cfg2 = RTL_R8(Config2) & ~MSIEnable;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2987
	if (cfg->features & RTL_FEATURE_MSI) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2988
		if (pci_enable_msi(pdev)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2989
			dev_info(&pdev->dev, "no MSI. Back to INTx.\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2990
		} else {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2991
			cfg2 |= MSIEnable;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2992
			msi = RTL_FEATURE_MSI;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2993
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2994
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2995
	RTL_W8(Config2, cfg2);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2996
	return msi;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2997
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2998
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2999
static void rtl_disable_msi(struct pci_dev *pdev, struct rtl8169_private *tp)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3000
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3001
	if (tp->features & RTL_FEATURE_MSI) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3002
		pci_disable_msi(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3003
		tp->features &= ~RTL_FEATURE_MSI;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3004
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3005
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3006
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3007
static const struct net_device_ops rtl8169_netdev_ops = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3008
	.ndo_open		= rtl8169_open,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3009
	.ndo_stop		= rtl8169_close,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3010
	.ndo_get_stats		= rtl8169_get_stats,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3011
	.ndo_start_xmit		= rtl8169_start_xmit,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3012
	.ndo_tx_timeout		= rtl8169_tx_timeout,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3013
	.ndo_validate_addr	= eth_validate_addr,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3014
	.ndo_change_mtu		= rtl8169_change_mtu,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3015
	.ndo_set_mac_address	= rtl_set_mac_address,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3016
	.ndo_do_ioctl		= rtl8169_ioctl,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3017
	.ndo_set_multicast_list	= rtl_set_rx_mode,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3018
#ifdef CONFIG_R8169_VLAN
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3019
	.ndo_vlan_rx_register	= rtl8169_vlan_rx_register,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3020
#endif
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3021
#ifdef CONFIG_NET_POLL_CONTROLLER
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3022
	.ndo_poll_controller	= rtl8169_netpoll,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3023
#endif
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3024
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3025
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3026
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3027
static int __devinit
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3028
rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3029
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3030
	const struct rtl_cfg_info *cfg = rtl_cfg_infos + ent->driver_data;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3031
	const unsigned int region = cfg->region;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3032
	struct rtl8169_private *tp;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3033
	struct mii_if_info *mii;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3034
	struct net_device *dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3035
	void __iomem *ioaddr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3036
	unsigned int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3037
	int rc;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3038
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3039
	if (netif_msg_drv(&debug)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3040
		printk(KERN_INFO "%s Gigabit Ethernet driver %s loaded\n",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3041
		       MODULENAME, RTL8169_VERSION);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3042
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3043
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3044
	dev = alloc_etherdev(sizeof (*tp));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3045
	if (!dev) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3046
		if (netif_msg_drv(&debug))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3047
			dev_err(&pdev->dev, "unable to alloc new ethernet\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3048
		rc = -ENOMEM;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3049
		goto out;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3050
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3051
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3052
	SET_NETDEV_DEV(dev, &pdev->dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3053
	dev->netdev_ops = &rtl8169_netdev_ops;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3054
	tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3055
	tp->dev = dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3056
	tp->pci_dev = pdev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3057
	tp->msg_enable = netif_msg_init(debug.msg_enable, R8169_MSG_DEFAULT);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3058
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3059
	mii = &tp->mii;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3060
	mii->dev = dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3061
	mii->mdio_read = rtl_mdio_read;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3062
	mii->mdio_write = rtl_mdio_write;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3063
	mii->phy_id_mask = 0x1f;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3064
	mii->reg_num_mask = 0x1f;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3065
	mii->supports_gmii = !!(cfg->features & RTL_FEATURE_GMII);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3066
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3067
	/* disable ASPM completely as that cause random device stop working
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3068
	 * problems as well as full system hangs for some PCIe devices users */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3069
	pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 |
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3070
				     PCIE_LINK_STATE_CLKPM);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3071
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3072
	/* enable device (incl. PCI PM wakeup and hotplug setup) */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3073
	rc = pci_enable_device(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3074
	if (rc < 0) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3075
		netif_err(tp, probe, dev, "enable failure\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3076
		goto err_out_free_dev_1;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3077
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3078
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3079
	if (pci_set_mwi(pdev) < 0)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3080
		netif_info(tp, probe, dev, "Mem-Wr-Inval unavailable\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3081
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3082
	/* make sure PCI base addr 1 is MMIO */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3083
	if (!(pci_resource_flags(pdev, region) & IORESOURCE_MEM)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3084
		netif_err(tp, probe, dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3085
			  "region #%d not an MMIO resource, aborting\n",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3086
			  region);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3087
		rc = -ENODEV;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3088
		goto err_out_mwi_2;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3089
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3090
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3091
	/* check for weird/broken PCI region reporting */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3092
	if (pci_resource_len(pdev, region) < R8169_REGS_SIZE) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3093
		netif_err(tp, probe, dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3094
			  "Invalid PCI region size(s), aborting\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3095
		rc = -ENODEV;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3096
		goto err_out_mwi_2;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3097
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3098
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3099
	rc = pci_request_regions(pdev, MODULENAME);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3100
	if (rc < 0) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3101
		netif_err(tp, probe, dev, "could not request regions\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3102
		goto err_out_mwi_2;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3103
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3104
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3105
	tp->cp_cmd = PCIMulRW | RxChkSum;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3106
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3107
	if ((sizeof(dma_addr_t) > 4) &&
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3108
	    !pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) && use_dac) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3109
		tp->cp_cmd |= PCIDAC;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3110
		dev->features |= NETIF_F_HIGHDMA;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3111
	} else {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3112
		rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3113
		if (rc < 0) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3114
			netif_err(tp, probe, dev, "DMA configuration failed\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3115
			goto err_out_free_res_3;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3116
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3117
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3118
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3119
	/* ioremap MMIO region */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3120
	ioaddr = ioremap(pci_resource_start(pdev, region), R8169_REGS_SIZE);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3121
	if (!ioaddr) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3122
		netif_err(tp, probe, dev, "cannot remap MMIO, aborting\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3123
		rc = -EIO;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3124
		goto err_out_free_res_3;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3125
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3126
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3127
	tp->pcie_cap = pci_find_capability(pdev, PCI_CAP_ID_EXP);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3128
	if (!tp->pcie_cap)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3129
		netif_info(tp, probe, dev, "no PCI Express capability\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3130
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3131
	RTL_W16(IntrMask, 0x0000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3132
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3133
	/* Soft reset the chip. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3134
	RTL_W8(ChipCmd, CmdReset);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3135
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3136
	/* Check that the chip has finished the reset. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3137
	for (i = 0; i < 100; i++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3138
		if ((RTL_R8(ChipCmd) & CmdReset) == 0)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3139
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3140
		msleep_interruptible(1);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3141
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3142
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3143
	RTL_W16(IntrStatus, 0xffff);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3144
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3145
	pci_set_master(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3146
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3147
	/* Identify chip attached to board */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3148
	rtl8169_get_mac_version(tp, ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3149
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3150
	/* Use appropriate default if unknown */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3151
	if (tp->mac_version == RTL_GIGA_MAC_NONE) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3152
		netif_notice(tp, probe, dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3153
			     "unknown MAC, using family default\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3154
		tp->mac_version = cfg->default_ver;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3155
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3156
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3157
	rtl8169_print_mac_version(tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3158
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3159
	for (i = 0; i < ARRAY_SIZE(rtl_chip_info); i++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3160
		if (tp->mac_version == rtl_chip_info[i].mac_version)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3161
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3162
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3163
	if (i == ARRAY_SIZE(rtl_chip_info)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3164
		dev_err(&pdev->dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3165
			"driver bug, MAC version not found in rtl_chip_info\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3166
		goto err_out_msi_4;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3167
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3168
	tp->chipset = i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3169
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3170
	RTL_W8(Cfg9346, Cfg9346_Unlock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3171
	RTL_W8(Config1, RTL_R8(Config1) | PMEnable);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3172
	RTL_W8(Config5, RTL_R8(Config5) & PMEStatus);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3173
	if ((RTL_R8(Config3) & (LinkUp | MagicPacket)) != 0)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3174
		tp->features |= RTL_FEATURE_WOL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3175
	if ((RTL_R8(Config5) & (UWF | BWF | MWF)) != 0)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3176
		tp->features |= RTL_FEATURE_WOL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3177
	tp->features |= rtl_try_msi(pdev, ioaddr, cfg);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3178
	RTL_W8(Cfg9346, Cfg9346_Lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3179
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3180
	if ((tp->mac_version <= RTL_GIGA_MAC_VER_06) &&
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3181
	    (RTL_R8(PHYstatus) & TBI_Enable)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3182
		tp->set_speed = rtl8169_set_speed_tbi;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3183
		tp->get_settings = rtl8169_gset_tbi;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3184
		tp->phy_reset_enable = rtl8169_tbi_reset_enable;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3185
		tp->phy_reset_pending = rtl8169_tbi_reset_pending;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3186
		tp->link_ok = rtl8169_tbi_link_ok;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3187
		tp->do_ioctl = rtl_tbi_ioctl;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3188
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3189
		tp->phy_1000_ctrl_reg = ADVERTISE_1000FULL; /* Implied by TBI */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3190
	} else {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3191
		tp->set_speed = rtl8169_set_speed_xmii;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3192
		tp->get_settings = rtl8169_gset_xmii;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3193
		tp->phy_reset_enable = rtl8169_xmii_reset_enable;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3194
		tp->phy_reset_pending = rtl8169_xmii_reset_pending;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3195
		tp->link_ok = rtl8169_xmii_link_ok;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3196
		tp->do_ioctl = rtl_xmii_ioctl;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3197
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3198
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3199
	spin_lock_init(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3200
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3201
	tp->mmio_addr = ioaddr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3202
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3203
	/* Get MAC address */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3204
	for (i = 0; i < MAC_ADDR_LEN; i++)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3205
		dev->dev_addr[i] = RTL_R8(MAC0 + i);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3206
	memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3207
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3208
	SET_ETHTOOL_OPS(dev, &rtl8169_ethtool_ops);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3209
	dev->watchdog_timeo = RTL8169_TX_TIMEOUT;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3210
	dev->irq = pdev->irq;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3211
	dev->base_addr = (unsigned long) ioaddr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3212
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3213
	netif_napi_add(dev, &tp->napi, rtl8169_poll, R8169_NAPI_WEIGHT);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3214
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3215
#ifdef CONFIG_R8169_VLAN
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3216
	dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3217
#endif
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3218
	dev->features |= NETIF_F_GRO;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3219
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3220
	tp->intr_mask = 0xffff;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3221
	tp->hw_start = cfg->hw_start;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3222
	tp->intr_event = cfg->intr_event;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3223
	tp->napi_event = cfg->napi_event;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3224
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3225
	init_timer(&tp->timer);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3226
	tp->timer.data = (unsigned long) dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3227
	tp->timer.function = rtl8169_phy_timer;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3228
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3229
	// offer device to EtherCAT master module
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3230
	tp->ecdev = ecdev_offer(dev, ec_poll, THIS_MODULE);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3231
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3232
	if (!tp->ecdev) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3233
		rc = register_netdev(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3234
		if (rc < 0)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3235
			goto err_out_msi_4;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3236
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3237
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3238
	pci_set_drvdata(pdev, dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3239
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3240
	netif_info(tp, probe, dev, "%s at 0x%lx, %pM, XID %08x IRQ %d\n",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3241
		   rtl_chip_info[tp->chipset].name,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3242
		   dev->base_addr, dev->dev_addr,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3243
		   (u32)(RTL_R32(TxConfig) & 0x9cf0f8ff), dev->irq);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3244
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3245
	rtl8169_init_phy(dev, tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3246
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3247
	/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3248
	 * Pretend we are using VLANs; This bypasses a nasty bug where
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3249
	 * Interrupts stop flowing on high load on 8110SCd controllers.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3250
	 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3251
	if (tp->mac_version == RTL_GIGA_MAC_VER_05)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3252
		RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) | RxVlan);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3253
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3254
	device_set_wakeup_enable(&pdev->dev, tp->features & RTL_FEATURE_WOL);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3255
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3256
	if (pci_dev_run_wake(pdev))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3257
		pm_runtime_put_noidle(&pdev->dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3258
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2254
diff changeset
  3259
	if (tp->ecdev) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2254
diff changeset
  3260
		rc = ecdev_open(tp->ecdev);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2254
diff changeset
  3261
		if (rc) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2254
diff changeset
  3262
			ecdev_withdraw(tp->ecdev);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2254
diff changeset
  3263
			goto err_out_msi_4;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2254
diff changeset
  3264
		}
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2254
diff changeset
  3265
	}
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2254
diff changeset
  3266
	else {
2186
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3267
		netif_carrier_off(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3268
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3269
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3270
out:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3271
	return rc;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3272
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3273
err_out_msi_4:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3274
	rtl_disable_msi(pdev, tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3275
	iounmap(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3276
err_out_free_res_3:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3277
	pci_release_regions(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3278
err_out_mwi_2:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3279
	pci_clear_mwi(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3280
	pci_disable_device(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3281
err_out_free_dev_1:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3282
	free_netdev(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3283
	goto out;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3284
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3285
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3286
static void __devexit rtl8169_remove_one(struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3287
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3288
	struct net_device *dev = pci_get_drvdata(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3289
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3290
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3291
	flush_scheduled_work();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3292
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3293
	if (tp->ecdev) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3294
		ecdev_close(tp->ecdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3295
		ecdev_withdraw(tp->ecdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3296
	} else {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3297
		unregister_netdev(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3298
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3299
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3300
	if (pci_dev_run_wake(pdev))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3301
		pm_runtime_get_noresume(&pdev->dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3302
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3303
	/* restore original MAC address */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3304
	rtl_rar_set(tp, dev->perm_addr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3305
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3306
	rtl_disable_msi(pdev, tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3307
	rtl8169_release_board(pdev, dev, tp->mmio_addr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3308
	pci_set_drvdata(pdev, NULL);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3309
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3310
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3311
static int rtl8169_open(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3312
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3313
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3314
	struct pci_dev *pdev = tp->pci_dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3315
	int retval = -ENOMEM;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3316
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3317
	pm_runtime_get_sync(&pdev->dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3318
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3319
	/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3320
	 * Rx and Tx desscriptors needs 256 bytes alignment.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3321
	 * dma_alloc_coherent provides more.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3322
	 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3323
	tp->TxDescArray = dma_alloc_coherent(&pdev->dev, R8169_TX_RING_BYTES,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3324
					     &tp->TxPhyAddr, GFP_KERNEL);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3325
	if (!tp->TxDescArray)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3326
		goto err_pm_runtime_put;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3327
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3328
	tp->RxDescArray = dma_alloc_coherent(&pdev->dev, R8169_RX_RING_BYTES,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3329
					     &tp->RxPhyAddr, GFP_KERNEL);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3330
	if (!tp->RxDescArray)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3331
		goto err_free_tx_0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3332
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3333
	retval = rtl8169_init_ring(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3334
	if (retval < 0)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3335
		goto err_free_rx_1;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3336
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3337
	INIT_DELAYED_WORK(&tp->task, NULL);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3338
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3339
	smp_mb();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3340
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3341
	if (!tp->ecdev) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3342
		retval = request_irq(dev->irq, rtl8169_interrupt,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3343
				(tp->features & RTL_FEATURE_MSI) ? 0 : IRQF_SHARED,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3344
				dev->name, dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3345
		if (retval < 0)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3346
			goto err_release_ring_2;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3347
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3348
		napi_enable(&tp->napi);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3349
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3350
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3351
	rtl_hw_start(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3352
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3353
	rtl8169_request_timer(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3354
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3355
	tp->saved_wolopts = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3356
	pm_runtime_put_noidle(&pdev->dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3357
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3358
	rtl8169_check_link_status(dev, tp, tp->mmio_addr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3359
out:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3360
	return retval;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3361
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3362
err_release_ring_2:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3363
	rtl8169_rx_clear(tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3364
err_free_rx_1:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3365
	dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3366
			  tp->RxPhyAddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3367
	tp->RxDescArray = NULL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3368
err_free_tx_0:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3369
	dma_free_coherent(&pdev->dev, R8169_TX_RING_BYTES, tp->TxDescArray,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3370
			  tp->TxPhyAddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3371
	tp->TxDescArray = NULL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3372
err_pm_runtime_put:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3373
	pm_runtime_put_noidle(&pdev->dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3374
	goto out;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3375
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3376
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3377
static void rtl8169_hw_reset(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3378
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3379
	/* Disable interrupts */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3380
	rtl8169_irq_mask_and_ack(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3381
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3382
	/* Reset the chipset */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3383
	RTL_W8(ChipCmd, CmdReset);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3384
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3385
	/* PCI commit */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3386
	RTL_R8(ChipCmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3387
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3388
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3389
static void rtl_set_rx_tx_config_registers(struct rtl8169_private *tp)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3390
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3391
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3392
	u32 cfg = rtl8169_rx_config;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3393
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3394
	cfg |= (RTL_R32(RxConfig) & rtl_chip_info[tp->chipset].RxConfigMask);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3395
	RTL_W32(RxConfig, cfg);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3396
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3397
	/* Set DMA burst size and Interframe Gap Time */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3398
	RTL_W32(TxConfig, (TX_DMA_BURST << TxDMAShift) |
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3399
		(InterFrameGap << TxInterFrameGapShift));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3400
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3401
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3402
static void rtl_hw_start(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3403
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3404
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3405
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3406
	unsigned int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3407
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3408
	/* Soft reset the chip. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3409
	RTL_W8(ChipCmd, CmdReset);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3410
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3411
	/* Check that the chip has finished the reset. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3412
	for (i = 0; i < 100; i++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3413
		if ((RTL_R8(ChipCmd) & CmdReset) == 0)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3414
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3415
		msleep_interruptible(1);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3416
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3417
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3418
	tp->hw_start(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3419
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3420
	if (!tp->ecdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3421
		netif_start_queue(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3422
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3423
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3424
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3425
static void rtl_set_rx_tx_desc_registers(struct rtl8169_private *tp,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3426
					 void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3427
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3428
	/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3429
	 * Magic spell: some iop3xx ARM board needs the TxDescAddrHigh
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3430
	 * register to be written before TxDescAddrLow to work.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3431
	 * Switching from MMIO to I/O access fixes the issue as well.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3432
	 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3433
	RTL_W32(TxDescStartAddrHigh, ((u64) tp->TxPhyAddr) >> 32);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3434
	RTL_W32(TxDescStartAddrLow, ((u64) tp->TxPhyAddr) & DMA_BIT_MASK(32));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3435
	RTL_W32(RxDescAddrHigh, ((u64) tp->RxPhyAddr) >> 32);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3436
	RTL_W32(RxDescAddrLow, ((u64) tp->RxPhyAddr) & DMA_BIT_MASK(32));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3437
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3438
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3439
static u16 rtl_rw_cpluscmd(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3440
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3441
	u16 cmd;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3442
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3443
	cmd = RTL_R16(CPlusCmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3444
	RTL_W16(CPlusCmd, cmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3445
	return cmd;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3446
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3447
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3448
static void rtl_set_rx_max_size(void __iomem *ioaddr, unsigned int rx_buf_sz)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3449
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3450
	/* Low hurts. Let's disable the filtering. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3451
	RTL_W16(RxMaxSize, rx_buf_sz + 1);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3452
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3453
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3454
static void rtl8169_set_magic_reg(void __iomem *ioaddr, unsigned mac_version)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3455
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3456
	static const struct {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3457
		u32 mac_version;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3458
		u32 clk;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3459
		u32 val;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3460
	} cfg2_info [] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3461
		{ RTL_GIGA_MAC_VER_05, PCI_Clock_33MHz, 0x000fff00 }, // 8110SCd
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3462
		{ RTL_GIGA_MAC_VER_05, PCI_Clock_66MHz, 0x000fffff },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3463
		{ RTL_GIGA_MAC_VER_06, PCI_Clock_33MHz, 0x00ffff00 }, // 8110SCe
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3464
		{ RTL_GIGA_MAC_VER_06, PCI_Clock_66MHz, 0x00ffffff }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3465
	}, *p = cfg2_info;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3466
	unsigned int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3467
	u32 clk;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3468
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3469
	clk = RTL_R8(Config2) & PCI_Clock_66MHz;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3470
	for (i = 0; i < ARRAY_SIZE(cfg2_info); i++, p++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3471
		if ((p->mac_version == mac_version) && (p->clk == clk)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3472
			RTL_W32(0x7c, p->val);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3473
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3474
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3475
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3476
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3477
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3478
static void rtl_hw_start_8169(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3479
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3480
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3481
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3482
	struct pci_dev *pdev = tp->pci_dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3483
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3484
	if (tp->mac_version == RTL_GIGA_MAC_VER_05) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3485
		RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) | PCIMulRW);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3486
		pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, 0x08);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3487
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3488
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3489
	RTL_W8(Cfg9346, Cfg9346_Unlock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3490
	if ((tp->mac_version == RTL_GIGA_MAC_VER_01) ||
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3491
	    (tp->mac_version == RTL_GIGA_MAC_VER_02) ||
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3492
	    (tp->mac_version == RTL_GIGA_MAC_VER_03) ||
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3493
	    (tp->mac_version == RTL_GIGA_MAC_VER_04))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3494
		RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3495
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3496
	RTL_W8(EarlyTxThres, EarlyTxThld);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3497
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3498
	rtl_set_rx_max_size(ioaddr, rx_buf_sz);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3499
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3500
	if ((tp->mac_version == RTL_GIGA_MAC_VER_01) ||
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3501
	    (tp->mac_version == RTL_GIGA_MAC_VER_02) ||
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3502
	    (tp->mac_version == RTL_GIGA_MAC_VER_03) ||
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3503
	    (tp->mac_version == RTL_GIGA_MAC_VER_04))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3504
		rtl_set_rx_tx_config_registers(tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3505
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3506
	tp->cp_cmd |= rtl_rw_cpluscmd(ioaddr) | PCIMulRW;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3507
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3508
	if ((tp->mac_version == RTL_GIGA_MAC_VER_02) ||
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3509
	    (tp->mac_version == RTL_GIGA_MAC_VER_03)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3510
		dprintk("Set MAC Reg C+CR Offset 0xE0. "
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3511
			"Bit-3 and bit-14 MUST be 1\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3512
		tp->cp_cmd |= (1 << 14);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3513
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3514
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3515
	RTL_W16(CPlusCmd, tp->cp_cmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3516
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3517
	rtl8169_set_magic_reg(ioaddr, tp->mac_version);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3518
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3519
	/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3520
	 * Undocumented corner. Supposedly:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3521
	 * (TxTimer << 12) | (TxPackets << 8) | (RxTimer << 4) | RxPackets
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3522
	 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3523
	RTL_W16(IntrMitigate, 0x0000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3524
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3525
	rtl_set_rx_tx_desc_registers(tp, ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3526
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3527
	if ((tp->mac_version != RTL_GIGA_MAC_VER_01) &&
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3528
	    (tp->mac_version != RTL_GIGA_MAC_VER_02) &&
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3529
	    (tp->mac_version != RTL_GIGA_MAC_VER_03) &&
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3530
	    (tp->mac_version != RTL_GIGA_MAC_VER_04)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3531
		RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3532
		rtl_set_rx_tx_config_registers(tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3533
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3534
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3535
	RTL_W8(Cfg9346, Cfg9346_Lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3536
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3537
	/* Initially a 10 us delay. Turned it into a PCI commit. - FR */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3538
	RTL_R8(IntrMask);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3539
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3540
	RTL_W32(RxMissed, 0);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3541
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3542
	rtl_set_rx_mode(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3543
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3544
	/* no early-rx interrupts */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3545
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xF000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3546
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3547
	/* Enable all known interrupts by setting the interrupt mask. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3548
	if (!tp->ecdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3549
		RTL_W16(IntrMask, tp->intr_event);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3550
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3551
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3552
static void rtl_tx_performance_tweak(struct pci_dev *pdev, u16 force)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3553
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3554
	struct net_device *dev = pci_get_drvdata(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3555
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3556
	int cap = tp->pcie_cap;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3557
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3558
	if (cap) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3559
		u16 ctl;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3560
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3561
		pci_read_config_word(pdev, cap + PCI_EXP_DEVCTL, &ctl);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3562
		ctl = (ctl & ~PCI_EXP_DEVCTL_READRQ) | force;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3563
		pci_write_config_word(pdev, cap + PCI_EXP_DEVCTL, ctl);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3564
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3565
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3566
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3567
static void rtl_csi_access_enable(void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3568
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3569
	u32 csi;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3570
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3571
	csi = rtl_csi_read(ioaddr, 0x070c) & 0x00ffffff;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3572
	rtl_csi_write(ioaddr, 0x070c, csi | 0x27000000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3573
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3574
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3575
struct ephy_info {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3576
	unsigned int offset;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3577
	u16 mask;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3578
	u16 bits;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3579
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3580
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3581
static void rtl_ephy_init(void __iomem *ioaddr, const struct ephy_info *e, int len)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3582
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3583
	u16 w;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3584
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3585
	while (len-- > 0) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3586
		w = (rtl_ephy_read(ioaddr, e->offset) & ~e->mask) | e->bits;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3587
		rtl_ephy_write(ioaddr, e->offset, w);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3588
		e++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3589
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3590
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3591
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3592
static void rtl_disable_clock_request(struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3593
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3594
	struct net_device *dev = pci_get_drvdata(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3595
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3596
	int cap = tp->pcie_cap;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3597
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3598
	if (cap) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3599
		u16 ctl;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3600
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3601
		pci_read_config_word(pdev, cap + PCI_EXP_LNKCTL, &ctl);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3602
		ctl &= ~PCI_EXP_LNKCTL_CLKREQ_EN;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3603
		pci_write_config_word(pdev, cap + PCI_EXP_LNKCTL, ctl);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3604
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3605
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3606
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3607
#define R8168_CPCMD_QUIRK_MASK (\
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3608
	EnableBist | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3609
	Mac_dbgo_oe | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3610
	Force_half_dup | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3611
	Force_rxflow_en | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3612
	Force_txflow_en | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3613
	Cxpl_dbg_sel | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3614
	ASF | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3615
	PktCntrDisable | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3616
	Mac_dbgo_sel)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3617
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3618
static void rtl_hw_start_8168bb(void __iomem *ioaddr, struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3619
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3620
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3621
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3622
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3623
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3624
	rtl_tx_performance_tweak(pdev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3625
		(0x5 << MAX_READ_REQUEST_SHIFT) | PCI_EXP_DEVCTL_NOSNOOP_EN);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3626
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3627
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3628
static void rtl_hw_start_8168bef(void __iomem *ioaddr, struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3629
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3630
	rtl_hw_start_8168bb(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3631
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3632
	RTL_W8(EarlyTxThres, EarlyTxThld);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3633
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3634
	RTL_W8(Config4, RTL_R8(Config4) & ~(1 << 0));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3635
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3636
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3637
static void __rtl_hw_start_8168cp(void __iomem *ioaddr, struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3638
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3639
	RTL_W8(Config1, RTL_R8(Config1) | Speed_down);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3640
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3641
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3642
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3643
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3644
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3645
	rtl_disable_clock_request(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3646
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3647
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3648
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3649
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3650
static void rtl_hw_start_8168cp_1(void __iomem *ioaddr, struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3651
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3652
	static const struct ephy_info e_info_8168cp[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3653
		{ 0x01, 0,	0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3654
		{ 0x02, 0x0800,	0x1000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3655
		{ 0x03, 0,	0x0042 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3656
		{ 0x06, 0x0080,	0x0000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3657
		{ 0x07, 0,	0x2000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3658
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3659
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3660
	rtl_csi_access_enable(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3661
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3662
	rtl_ephy_init(ioaddr, e_info_8168cp, ARRAY_SIZE(e_info_8168cp));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3663
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3664
	__rtl_hw_start_8168cp(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3665
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3666
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3667
static void rtl_hw_start_8168cp_2(void __iomem *ioaddr, struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3668
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3669
	rtl_csi_access_enable(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3670
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3671
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3672
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3673
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3674
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3675
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3676
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3677
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3678
static void rtl_hw_start_8168cp_3(void __iomem *ioaddr, struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3679
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3680
	rtl_csi_access_enable(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3681
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3682
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3683
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3684
	/* Magic. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3685
	RTL_W8(DBG_REG, 0x20);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3686
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3687
	RTL_W8(EarlyTxThres, EarlyTxThld);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3688
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3689
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3690
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3691
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3692
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3693
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3694
static void rtl_hw_start_8168c_1(void __iomem *ioaddr, struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3695
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3696
	static const struct ephy_info e_info_8168c_1[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3697
		{ 0x02, 0x0800,	0x1000 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3698
		{ 0x03, 0,	0x0002 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3699
		{ 0x06, 0x0080,	0x0000 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3700
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3701
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3702
	rtl_csi_access_enable(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3703
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3704
	RTL_W8(DBG_REG, 0x06 | FIX_NAK_1 | FIX_NAK_2);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3705
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3706
	rtl_ephy_init(ioaddr, e_info_8168c_1, ARRAY_SIZE(e_info_8168c_1));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3707
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3708
	__rtl_hw_start_8168cp(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3709
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3710
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3711
static void rtl_hw_start_8168c_2(void __iomem *ioaddr, struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3712
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3713
	static const struct ephy_info e_info_8168c_2[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3714
		{ 0x01, 0,	0x0001 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3715
		{ 0x03, 0x0400,	0x0220 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3716
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3717
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3718
	rtl_csi_access_enable(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3719
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3720
	rtl_ephy_init(ioaddr, e_info_8168c_2, ARRAY_SIZE(e_info_8168c_2));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3721
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3722
	__rtl_hw_start_8168cp(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3723
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3724
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3725
static void rtl_hw_start_8168c_3(void __iomem *ioaddr, struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3726
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3727
	rtl_hw_start_8168c_2(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3728
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3729
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3730
static void rtl_hw_start_8168c_4(void __iomem *ioaddr, struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3731
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3732
	rtl_csi_access_enable(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3733
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3734
	__rtl_hw_start_8168cp(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3735
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3736
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3737
static void rtl_hw_start_8168d(void __iomem *ioaddr, struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3738
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3739
	rtl_csi_access_enable(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3740
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3741
	rtl_disable_clock_request(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3742
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3743
	RTL_W8(EarlyTxThres, EarlyTxThld);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3744
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3745
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3746
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3747
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3748
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3749
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3750
static void rtl_hw_start_8168(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3751
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3752
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3753
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3754
	struct pci_dev *pdev = tp->pci_dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3755
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3756
	RTL_W8(Cfg9346, Cfg9346_Unlock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3757
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3758
	RTL_W8(EarlyTxThres, EarlyTxThld);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3759
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3760
	rtl_set_rx_max_size(ioaddr, rx_buf_sz);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3761
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3762
	tp->cp_cmd |= RTL_R16(CPlusCmd) | PktCntrDisable | INTT_1;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3763
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3764
	RTL_W16(CPlusCmd, tp->cp_cmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3765
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3766
	RTL_W16(IntrMitigate, 0x5151);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3767
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3768
	/* Work around for RxFIFO overflow. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3769
	if (tp->mac_version == RTL_GIGA_MAC_VER_11 ||
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3770
	    tp->mac_version == RTL_GIGA_MAC_VER_22) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3771
		tp->intr_event |= RxFIFOOver | PCSTimeout;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3772
		tp->intr_event &= ~RxOverflow;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3773
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3774
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3775
	rtl_set_rx_tx_desc_registers(tp, ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3776
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3777
	rtl_set_rx_mode(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3778
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3779
	RTL_W32(TxConfig, (TX_DMA_BURST << TxDMAShift) |
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3780
		(InterFrameGap << TxInterFrameGapShift));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3781
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3782
	RTL_R8(IntrMask);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3783
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3784
	switch (tp->mac_version) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3785
	case RTL_GIGA_MAC_VER_11:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3786
		rtl_hw_start_8168bb(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3787
	break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3788
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3789
	case RTL_GIGA_MAC_VER_12:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3790
	case RTL_GIGA_MAC_VER_17:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3791
		rtl_hw_start_8168bef(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3792
	break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3793
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3794
	case RTL_GIGA_MAC_VER_18:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3795
		rtl_hw_start_8168cp_1(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3796
	break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3797
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3798
	case RTL_GIGA_MAC_VER_19:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3799
		rtl_hw_start_8168c_1(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3800
	break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3801
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3802
	case RTL_GIGA_MAC_VER_20:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3803
		rtl_hw_start_8168c_2(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3804
	break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3805
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3806
	case RTL_GIGA_MAC_VER_21:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3807
		rtl_hw_start_8168c_3(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3808
	break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3809
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3810
	case RTL_GIGA_MAC_VER_22:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3811
		rtl_hw_start_8168c_4(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3812
	break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3813
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3814
	case RTL_GIGA_MAC_VER_23:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3815
		rtl_hw_start_8168cp_2(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3816
	break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3817
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3818
	case RTL_GIGA_MAC_VER_24:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3819
		rtl_hw_start_8168cp_3(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3820
	break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3821
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3822
	case RTL_GIGA_MAC_VER_25:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3823
	case RTL_GIGA_MAC_VER_26:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3824
	case RTL_GIGA_MAC_VER_27:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3825
		rtl_hw_start_8168d(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3826
	break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3827
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3828
	default:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3829
		printk(KERN_ERR PFX "%s: unknown chipset (mac_version = %d).\n",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3830
			dev->name, tp->mac_version);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3831
	break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3832
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3833
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3834
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3835
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3836
	RTL_W8(Cfg9346, Cfg9346_Lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3837
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3838
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xF000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3839
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3840
	if (!tp->ecdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3841
		RTL_W16(IntrMask, tp->intr_event);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3842
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3843
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3844
#define R810X_CPCMD_QUIRK_MASK (\
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3845
	EnableBist | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3846
	Mac_dbgo_oe | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3847
	Force_half_dup | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3848
	Force_rxflow_en | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3849
	Force_txflow_en | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3850
	Cxpl_dbg_sel | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3851
	ASF | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3852
	PktCntrDisable | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3853
	PCIDAC | \
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3854
	PCIMulRW)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3855
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3856
static void rtl_hw_start_8102e_1(void __iomem *ioaddr, struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3857
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3858
	static const struct ephy_info e_info_8102e_1[] = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3859
		{ 0x01,	0, 0x6e65 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3860
		{ 0x02,	0, 0x091f },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3861
		{ 0x03,	0, 0xc2f9 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3862
		{ 0x06,	0, 0xafb5 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3863
		{ 0x07,	0, 0x0e00 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3864
		{ 0x19,	0, 0xec80 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3865
		{ 0x01,	0, 0x2e65 },
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3866
		{ 0x01,	0, 0x6e65 }
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3867
	};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3868
	u8 cfg1;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3869
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3870
	rtl_csi_access_enable(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3871
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3872
	RTL_W8(DBG_REG, FIX_NAK_1);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3873
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3874
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3875
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3876
	RTL_W8(Config1,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3877
	       LEDS1 | LEDS0 | Speed_down | MEMMAP | IOMAP | VPD | PMEnable);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3878
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3879
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3880
	cfg1 = RTL_R8(Config1);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3881
	if ((cfg1 & LEDS0) && (cfg1 & LEDS1))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3882
		RTL_W8(Config1, cfg1 & ~LEDS0);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3883
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3884
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R810X_CPCMD_QUIRK_MASK);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3885
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3886
	rtl_ephy_init(ioaddr, e_info_8102e_1, ARRAY_SIZE(e_info_8102e_1));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3887
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3888
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3889
static void rtl_hw_start_8102e_2(void __iomem *ioaddr, struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3890
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3891
	rtl_csi_access_enable(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3892
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3893
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3894
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3895
	RTL_W8(Config1, MEMMAP | IOMAP | VPD | PMEnable);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3896
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3897
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3898
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R810X_CPCMD_QUIRK_MASK);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3899
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3900
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3901
static void rtl_hw_start_8102e_3(void __iomem *ioaddr, struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3902
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3903
	rtl_hw_start_8102e_2(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3904
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3905
	rtl_ephy_write(ioaddr, 0x03, 0xc2f9);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3906
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3907
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3908
static void rtl_hw_start_8101(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3909
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3910
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3911
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3912
	struct pci_dev *pdev = tp->pci_dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3913
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3914
	if ((tp->mac_version == RTL_GIGA_MAC_VER_13) ||
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3915
	    (tp->mac_version == RTL_GIGA_MAC_VER_16)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3916
		int cap = tp->pcie_cap;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3917
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3918
		if (cap) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3919
			pci_write_config_word(pdev, cap + PCI_EXP_DEVCTL,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3920
					      PCI_EXP_DEVCTL_NOSNOOP_EN);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3921
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3922
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3923
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3924
	switch (tp->mac_version) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3925
	case RTL_GIGA_MAC_VER_07:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3926
		rtl_hw_start_8102e_1(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3927
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3928
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3929
	case RTL_GIGA_MAC_VER_08:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3930
		rtl_hw_start_8102e_3(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3931
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3932
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3933
	case RTL_GIGA_MAC_VER_09:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3934
		rtl_hw_start_8102e_2(ioaddr, pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3935
		break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3936
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3937
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3938
	RTL_W8(Cfg9346, Cfg9346_Unlock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3939
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3940
	RTL_W8(EarlyTxThres, EarlyTxThld);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3941
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3942
	rtl_set_rx_max_size(ioaddr, rx_buf_sz);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3943
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3944
	tp->cp_cmd |= rtl_rw_cpluscmd(ioaddr) | PCIMulRW;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3945
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3946
	RTL_W16(CPlusCmd, tp->cp_cmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3947
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3948
	RTL_W16(IntrMitigate, 0x0000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3949
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3950
	rtl_set_rx_tx_desc_registers(tp, ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3951
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3952
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3953
	rtl_set_rx_tx_config_registers(tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3954
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3955
	RTL_W8(Cfg9346, Cfg9346_Lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3956
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3957
	RTL_R8(IntrMask);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3958
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3959
	rtl_set_rx_mode(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3960
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3961
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3962
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3963
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xf000);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3964
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3965
	if (!tp->ecdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3966
		RTL_W16(IntrMask, tp->intr_event);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3967
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3968
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3969
static int rtl8169_change_mtu(struct net_device *dev, int new_mtu)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3970
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3971
	if (new_mtu < ETH_ZLEN || new_mtu > SafeMtu)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3972
		return -EINVAL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3973
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3974
	dev->mtu = new_mtu;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3975
	return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3976
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3977
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3978
static inline void rtl8169_make_unusable_by_asic(struct RxDesc *desc)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3979
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3980
	desc->addr = cpu_to_le64(0x0badbadbadbadbadull);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3981
	desc->opts1 &= ~cpu_to_le32(DescOwn | RsvdMask);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3982
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3983
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3984
static void rtl8169_free_rx_databuff(struct rtl8169_private *tp,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3985
				     void **data_buff, struct RxDesc *desc)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3986
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3987
	dma_unmap_single(&tp->pci_dev->dev, le64_to_cpu(desc->addr), rx_buf_sz,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3988
			 DMA_FROM_DEVICE);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3989
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3990
	kfree(*data_buff);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3991
	*data_buff = NULL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3992
	rtl8169_make_unusable_by_asic(desc);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3993
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3994
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3995
static inline void rtl8169_mark_to_asic(struct RxDesc *desc, u32 rx_buf_sz)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3996
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3997
	u32 eor = le32_to_cpu(desc->opts1) & RingEnd;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3998
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3999
	desc->opts1 = cpu_to_le32(DescOwn | eor | rx_buf_sz);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4000
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4001
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4002
static inline void rtl8169_map_to_asic(struct RxDesc *desc, dma_addr_t mapping,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4003
				       u32 rx_buf_sz)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4004
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4005
	desc->addr = cpu_to_le64(mapping);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4006
	wmb();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4007
	rtl8169_mark_to_asic(desc, rx_buf_sz);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4008
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4009
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4010
static inline void *rtl8169_align(void *data)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4011
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4012
	return (void *)ALIGN((long)data, 16);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4013
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4014
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4015
static struct sk_buff *rtl8169_alloc_rx_data(struct rtl8169_private *tp,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4016
					     struct RxDesc *desc)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4017
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4018
	void *data;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4019
	dma_addr_t mapping;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4020
	struct device *d = &tp->pci_dev->dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4021
	struct net_device *dev = tp->dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4022
	int node = dev->dev.parent ? dev_to_node(dev->dev.parent) : -1;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4023
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4024
	data = kmalloc_node(rx_buf_sz, GFP_KERNEL, node);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4025
	if (!data)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4026
		return NULL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4027
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4028
	if (rtl8169_align(data) != data) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4029
		kfree(data);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4030
		data = kmalloc_node(rx_buf_sz + 15, GFP_KERNEL, node);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4031
		if (!data)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4032
			return NULL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4033
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4034
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4035
	mapping = dma_map_single(d, rtl8169_align(data), rx_buf_sz,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4036
				 DMA_FROM_DEVICE);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4037
	if (unlikely(dma_mapping_error(d, mapping))) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4038
		if (net_ratelimit())
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4039
			netif_err(tp, drv, tp->dev, "Failed to map RX DMA!\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4040
		goto err_out;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4041
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4042
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4043
	rtl8169_map_to_asic(desc, mapping, rx_buf_sz);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4044
	return data;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4045
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4046
err_out:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4047
	kfree(data);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4048
	return NULL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4049
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4050
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4051
static void rtl8169_rx_clear(struct rtl8169_private *tp)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4052
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4053
	unsigned int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4054
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4055
	for (i = 0; i < NUM_RX_DESC; i++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4056
		if (tp->Rx_databuff[i]) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4057
			rtl8169_free_rx_databuff(tp, tp->Rx_databuff + i,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4058
					    tp->RxDescArray + i);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4059
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4060
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4061
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4062
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4063
static inline void rtl8169_mark_as_last_descriptor(struct RxDesc *desc)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4064
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4065
	desc->opts1 |= cpu_to_le32(RingEnd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4066
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4067
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4068
static int rtl8169_rx_fill(struct rtl8169_private *tp)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4069
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4070
	unsigned int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4071
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4072
	for (i = 0; i < NUM_RX_DESC; i++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4073
		void *data;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4074
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4075
		if (tp->Rx_databuff[i])
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4076
			continue;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4077
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4078
		data = rtl8169_alloc_rx_data(tp, tp->RxDescArray + i);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4079
		if (!data) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4080
			rtl8169_make_unusable_by_asic(tp->RxDescArray + i);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4081
			goto err_out;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4082
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4083
		tp->Rx_databuff[i] = data;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4084
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4085
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4086
	rtl8169_mark_as_last_descriptor(tp->RxDescArray + NUM_RX_DESC - 1);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4087
	return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4088
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4089
err_out:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4090
	rtl8169_rx_clear(tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4091
	return -ENOMEM;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4092
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4093
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4094
static void rtl8169_init_ring_indexes(struct rtl8169_private *tp)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4095
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4096
	tp->dirty_tx = tp->dirty_rx = tp->cur_tx = tp->cur_rx = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4097
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4098
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4099
static int rtl8169_init_ring(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4100
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4101
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4102
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4103
	rtl8169_init_ring_indexes(tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4104
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4105
	memset(tp->tx_skb, 0x0, NUM_TX_DESC * sizeof(struct ring_info));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4106
	memset(tp->Rx_databuff, 0x0, NUM_RX_DESC * sizeof(void *));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4107
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4108
	return rtl8169_rx_fill(tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4109
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4110
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4111
static void rtl8169_unmap_tx_skb(struct device *d, struct ring_info *tx_skb,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4112
				 struct TxDesc *desc)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4113
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4114
	unsigned int len = tx_skb->len;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4115
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4116
	dma_unmap_single(d, le64_to_cpu(desc->addr), len, DMA_TO_DEVICE);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4117
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4118
	desc->opts1 = 0x00;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4119
	desc->opts2 = 0x00;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4120
	desc->addr = 0x00;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4121
	tx_skb->len = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4122
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4123
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4124
static void rtl8169_tx_clear_range(struct rtl8169_private *tp, u32 start,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4125
				   unsigned int n)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4126
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4127
	unsigned int i;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4128
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4129
	for (i = 0; i < n; i++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4130
		unsigned int entry = (start + i) % NUM_TX_DESC;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4131
		struct ring_info *tx_skb = tp->tx_skb + entry;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4132
		unsigned int len = tx_skb->len;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4133
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4134
		if (len) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4135
			struct sk_buff *skb = tx_skb->skb;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4136
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4137
			rtl8169_unmap_tx_skb(&tp->pci_dev->dev, tx_skb,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4138
					     tp->TxDescArray + entry);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4139
			if (skb) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4140
				tp->dev->stats.tx_dropped++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4141
				if (!tp->ecdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4142
					dev_kfree_skb(skb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4143
				tx_skb->skb = NULL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4144
			}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4145
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4146
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4147
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4148
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4149
static void rtl8169_tx_clear(struct rtl8169_private *tp)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4150
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4151
	rtl8169_tx_clear_range(tp, tp->dirty_tx, NUM_TX_DESC);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4152
	tp->cur_tx = tp->dirty_tx = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4153
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4154
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4155
static void rtl8169_schedule_work(struct net_device *dev, work_func_t task)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4156
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4157
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4158
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4159
	PREPARE_DELAYED_WORK(&tp->task, task);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4160
	schedule_delayed_work(&tp->task, 4);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4161
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4162
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4163
static void rtl8169_wait_for_quiescence(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4164
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4165
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4166
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4167
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4168
	synchronize_irq(dev->irq);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4169
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4170
	/* Wait for any pending NAPI task to complete */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4171
	napi_disable(&tp->napi);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4172
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4173
	rtl8169_irq_mask_and_ack(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4174
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4175
	tp->intr_mask = 0xffff;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4176
	RTL_W16(IntrMask, tp->intr_event);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4177
	napi_enable(&tp->napi);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4178
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4179
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4180
static void rtl8169_reinit_task(struct work_struct *work)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4181
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4182
	struct rtl8169_private *tp =
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4183
		container_of(work, struct rtl8169_private, task.work);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4184
	struct net_device *dev = tp->dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4185
	int ret;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4186
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4187
	rtnl_lock();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4188
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4189
	if (!netif_running(dev))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4190
		goto out_unlock;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4191
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4192
	rtl8169_wait_for_quiescence(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4193
	rtl8169_close(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4194
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4195
	ret = rtl8169_open(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4196
	if (unlikely(ret < 0)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4197
		if (net_ratelimit())
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4198
			netif_err(tp, drv, dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4199
				  "reinit failure (status = %d). Rescheduling\n",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4200
				  ret);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4201
		rtl8169_schedule_work(dev, rtl8169_reinit_task);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4202
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4203
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4204
out_unlock:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4205
	rtnl_unlock();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4206
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4207
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4208
static void rtl8169_reset_task(struct work_struct *work)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4209
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4210
	struct rtl8169_private *tp =
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4211
		container_of(work, struct rtl8169_private, task.work);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4212
	struct net_device *dev = tp->dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4213
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4214
	rtnl_lock();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4215
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4216
	if (!netif_running(dev))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4217
		goto out_unlock;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4218
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4219
	rtl8169_wait_for_quiescence(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4220
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4221
	rtl8169_rx_interrupt(dev, tp, tp->mmio_addr, ~(u32)0);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4222
	rtl8169_tx_clear(tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4223
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4224
	if (tp->dirty_rx == tp->cur_rx) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4225
		rtl8169_init_ring_indexes(tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4226
		rtl_hw_start(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4227
		netif_wake_queue(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4228
		rtl8169_check_link_status(dev, tp, tp->mmio_addr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4229
	} else {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4230
		if (net_ratelimit())
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4231
			netif_emerg(tp, intr, dev, "Rx buffers shortage\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4232
		rtl8169_schedule_work(dev, rtl8169_reset_task);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4233
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4234
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4235
out_unlock:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4236
	rtnl_unlock();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4237
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4238
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4239
static void rtl8169_tx_timeout(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4240
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4241
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4242
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4243
	if (tp->ecdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4244
		return;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4245
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4246
	rtl8169_hw_reset(tp->mmio_addr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4247
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4248
	/* Let's wait a bit while any (async) irq lands on */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4249
	rtl8169_schedule_work(dev, rtl8169_reset_task);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4250
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4251
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4252
static int rtl8169_xmit_frags(struct rtl8169_private *tp, struct sk_buff *skb,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4253
			      u32 opts1)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4254
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4255
	struct skb_shared_info *info = skb_shinfo(skb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4256
	unsigned int cur_frag, entry;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4257
	struct TxDesc * uninitialized_var(txd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4258
	struct device *d = &tp->pci_dev->dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4259
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4260
	entry = tp->cur_tx;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4261
	for (cur_frag = 0; cur_frag < info->nr_frags; cur_frag++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4262
		skb_frag_t *frag = info->frags + cur_frag;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4263
		dma_addr_t mapping;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4264
		u32 status, len;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4265
		void *addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4266
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4267
		entry = (entry + 1) % NUM_TX_DESC;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4268
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4269
		txd = tp->TxDescArray + entry;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4270
		len = frag->size;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4271
		addr = ((void *) page_address(frag->page)) + frag->page_offset;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4272
		mapping = dma_map_single(d, addr, len, DMA_TO_DEVICE);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4273
		if (unlikely(dma_mapping_error(d, mapping))) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4274
			if (net_ratelimit())
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4275
				netif_err(tp, drv, tp->dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4276
					  "Failed to map TX fragments DMA!\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4277
			goto err_out;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4278
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4279
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4280
		/* anti gcc 2.95.3 bugware (sic) */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4281
		status = opts1 | len | (RingEnd * !((entry + 1) % NUM_TX_DESC));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4282
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4283
		txd->opts1 = cpu_to_le32(status);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4284
		txd->addr = cpu_to_le64(mapping);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4285
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4286
		tp->tx_skb[entry].len = len;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4287
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4288
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4289
	if (cur_frag) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4290
		tp->tx_skb[entry].skb = skb;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4291
		txd->opts1 |= cpu_to_le32(LastFrag);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4292
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4293
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4294
	return cur_frag;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4295
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4296
err_out:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4297
	rtl8169_tx_clear_range(tp, tp->cur_tx + 1, cur_frag);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4298
	return -EIO;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4299
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4300
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4301
static inline u32 rtl8169_tso_csum(struct sk_buff *skb, struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4302
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4303
	if (dev->features & NETIF_F_TSO) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4304
		u32 mss = skb_shinfo(skb)->gso_size;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4305
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4306
		if (mss)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4307
			return LargeSend | ((mss & MSSMask) << MSSShift);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4308
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4309
	if (skb->ip_summed == CHECKSUM_PARTIAL) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4310
		const struct iphdr *ip = ip_hdr(skb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4311
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4312
		if (ip->protocol == IPPROTO_TCP)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4313
			return IPCS | TCPCS;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4314
		else if (ip->protocol == IPPROTO_UDP)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4315
			return IPCS | UDPCS;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4316
		WARN_ON(1);	/* we need a WARN() */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4317
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4318
	return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4319
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4320
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4321
static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4322
				      struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4323
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4324
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4325
	unsigned int entry = tp->cur_tx % NUM_TX_DESC;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4326
	struct TxDesc *txd = tp->TxDescArray + entry;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4327
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4328
	struct device *d = &tp->pci_dev->dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4329
	dma_addr_t mapping;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4330
	u32 status, len;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4331
	u32 opts1;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4332
	int frags;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4333
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4334
	if (unlikely(TX_BUFFS_AVAIL(tp) < skb_shinfo(skb)->nr_frags)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4335
		netif_err(tp, drv, dev, "BUG! Tx Ring full when queue awake!\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4336
		goto err_stop_0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4337
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4338
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4339
	if (unlikely(le32_to_cpu(txd->opts1) & DescOwn))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4340
		goto err_stop_0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4341
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4342
	len = skb_headlen(skb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4343
	mapping = dma_map_single(d, skb->data, len, DMA_TO_DEVICE);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4344
	if (unlikely(dma_mapping_error(d, mapping))) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4345
		if (net_ratelimit())
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4346
			netif_err(tp, drv, dev, "Failed to map TX DMA!\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4347
		goto err_dma_0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4348
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4349
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4350
	tp->tx_skb[entry].len = len;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4351
	txd->addr = cpu_to_le64(mapping);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4352
	txd->opts2 = cpu_to_le32(rtl8169_tx_vlan_tag(tp, skb));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4353
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4354
	opts1 = DescOwn | rtl8169_tso_csum(skb, dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4355
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4356
	frags = rtl8169_xmit_frags(tp, skb, opts1);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4357
	if (frags < 0)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4358
		goto err_dma_1;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4359
	else if (frags)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4360
		opts1 |= FirstFrag;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4361
	else {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4362
		opts1 |= FirstFrag | LastFrag;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4363
		tp->tx_skb[entry].skb = skb;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4364
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4365
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4366
	wmb();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4367
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4368
	/* anti gcc 2.95.3 bugware (sic) */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4369
	status = opts1 | len | (RingEnd * !((entry + 1) % NUM_TX_DESC));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4370
	txd->opts1 = cpu_to_le32(status);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4371
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4372
	tp->cur_tx += frags + 1;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4373
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4374
	wmb();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4375
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4376
	RTL_W8(TxPoll, NPQ);	/* set polling bit */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4377
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4378
	if (!tp->ecdev && TX_BUFFS_AVAIL(tp) < MAX_SKB_FRAGS) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4379
		netif_stop_queue(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4380
		smp_rmb();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4381
		if (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4382
			netif_wake_queue(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4383
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4384
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4385
	return NETDEV_TX_OK;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4386
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4387
err_dma_1:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4388
	rtl8169_unmap_tx_skb(d, tp->tx_skb + entry, txd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4389
err_dma_0:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4390
	if (!tp->ecdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4391
		dev_kfree_skb(skb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4392
	dev->stats.tx_dropped++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4393
	return NETDEV_TX_OK;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4394
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4395
err_stop_0:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4396
	if (!tp->ecdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4397
		netif_stop_queue(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4398
	dev->stats.tx_dropped++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4399
	return NETDEV_TX_BUSY;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4400
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4401
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4402
static void rtl8169_pcierr_interrupt(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4403
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4404
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4405
	struct pci_dev *pdev = tp->pci_dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4406
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4407
	u16 pci_status, pci_cmd;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4408
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4409
	pci_read_config_word(pdev, PCI_COMMAND, &pci_cmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4410
	pci_read_config_word(pdev, PCI_STATUS, &pci_status);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4411
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4412
	netif_err(tp, intr, dev, "PCI error (cmd = 0x%04x, status = 0x%04x)\n",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4413
		  pci_cmd, pci_status);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4414
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4415
	/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4416
	 * The recovery sequence below admits a very elaborated explanation:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4417
	 * - it seems to work;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4418
	 * - I did not see what else could be done;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4419
	 * - it makes iop3xx happy.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4420
	 *
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4421
	 * Feel free to adjust to your needs.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4422
	 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4423
	if (pdev->broken_parity_status)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4424
		pci_cmd &= ~PCI_COMMAND_PARITY;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4425
	else
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4426
		pci_cmd |= PCI_COMMAND_SERR | PCI_COMMAND_PARITY;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4427
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4428
	pci_write_config_word(pdev, PCI_COMMAND, pci_cmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4429
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4430
	pci_write_config_word(pdev, PCI_STATUS,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4431
		pci_status & (PCI_STATUS_DETECTED_PARITY |
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4432
		PCI_STATUS_SIG_SYSTEM_ERROR | PCI_STATUS_REC_MASTER_ABORT |
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4433
		PCI_STATUS_REC_TARGET_ABORT | PCI_STATUS_SIG_TARGET_ABORT));
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4434
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4435
	/* The infamous DAC f*ckup only happens at boot time */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4436
	if ((tp->cp_cmd & PCIDAC) && !tp->dirty_rx && !tp->cur_rx) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4437
		netif_info(tp, intr, dev, "disabling PCI DAC\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4438
		tp->cp_cmd &= ~PCIDAC;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4439
		RTL_W16(CPlusCmd, tp->cp_cmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4440
		dev->features &= ~NETIF_F_HIGHDMA;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4441
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4442
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4443
	rtl8169_hw_reset(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4444
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4445
	rtl8169_schedule_work(dev, rtl8169_reinit_task);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4446
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4447
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4448
static void rtl8169_tx_interrupt(struct net_device *dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4449
				 struct rtl8169_private *tp,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4450
				 void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4451
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4452
	unsigned int dirty_tx, tx_left;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4453
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4454
	dirty_tx = tp->dirty_tx;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4455
	smp_rmb();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4456
	tx_left = tp->cur_tx - dirty_tx;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4457
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4458
	while (tx_left > 0) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4459
		unsigned int entry = dirty_tx % NUM_TX_DESC;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4460
		struct ring_info *tx_skb = tp->tx_skb + entry;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4461
		u32 status;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4462
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4463
		rmb();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4464
		status = le32_to_cpu(tp->TxDescArray[entry].opts1);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4465
		if (status & DescOwn)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4466
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4467
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4468
		rtl8169_unmap_tx_skb(&tp->pci_dev->dev, tx_skb,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4469
				     tp->TxDescArray + entry);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4470
		if (status & LastFrag) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4471
			dev->stats.tx_packets++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4472
			dev->stats.tx_bytes += tx_skb->skb->len;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4473
			if (!tp->ecdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4474
				dev_kfree_skb(tx_skb->skb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4475
			tx_skb->skb = NULL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4476
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4477
		dirty_tx++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4478
		tx_left--;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4479
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4480
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4481
	if (tp->dirty_tx != dirty_tx) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4482
		tp->dirty_tx = dirty_tx;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4483
		smp_wmb();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4484
		if (!tp->ecdev && netif_queue_stopped(dev) &&
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4485
		    (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4486
			netif_wake_queue(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4487
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4488
		/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4489
		 * 8168 hack: TxPoll requests are lost when the Tx packets are
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4490
		 * too close. Let's kick an extra TxPoll request when a burst
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4491
		 * of start_xmit activity is detected (if it is not detected,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4492
		 * it is slow enough). -- FR
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4493
		 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4494
		smp_rmb();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4495
		if (tp->cur_tx != dirty_tx)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4496
			RTL_W8(TxPoll, NPQ);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4497
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4498
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4499
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4500
static inline int rtl8169_fragmented_frame(u32 status)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4501
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4502
	return (status & (FirstFrag | LastFrag)) != (FirstFrag | LastFrag);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4503
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4504
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4505
static inline void rtl8169_rx_csum(struct sk_buff *skb, u32 opts1)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4506
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4507
	u32 status = opts1 & RxProtoMask;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4508
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4509
	if (((status == RxProtoTCP) && !(opts1 & TCPFail)) ||
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4510
	    ((status == RxProtoUDP) && !(opts1 & UDPFail)))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4511
		skb->ip_summed = CHECKSUM_UNNECESSARY;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4512
	else
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4513
		skb_checksum_none_assert(skb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4514
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4515
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4516
static struct sk_buff *rtl8169_try_rx_copy(void *data,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4517
					   struct rtl8169_private *tp,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4518
					   int pkt_size,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4519
					   dma_addr_t addr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4520
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4521
	struct sk_buff *skb;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4522
	struct device *d = &tp->pci_dev->dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4523
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4524
	data = rtl8169_align(data);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4525
	dma_sync_single_for_cpu(d, addr, pkt_size, DMA_FROM_DEVICE);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4526
	prefetch(data);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4527
	skb = netdev_alloc_skb_ip_align(tp->dev, pkt_size);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4528
	if (skb)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4529
		memcpy(skb->data, data, pkt_size);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4530
	dma_sync_single_for_device(d, addr, pkt_size, DMA_FROM_DEVICE);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4531
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4532
	return skb;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4533
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4534
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4535
/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4536
 * Warning : rtl8169_rx_interrupt() might be called :
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4537
 * 1) from NAPI (softirq) context
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4538
 *	(polling = 1 : we should call netif_receive_skb())
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4539
 * 2) from process context (rtl8169_reset_task())
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4540
 *	(polling = 0 : we must call netif_rx() instead)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4541
 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4542
static int rtl8169_rx_interrupt(struct net_device *dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4543
				struct rtl8169_private *tp,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4544
				void __iomem *ioaddr, u32 budget)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4545
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4546
	unsigned int cur_rx, rx_left;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4547
	unsigned int count;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4548
	int polling = (budget != ~(u32)0) ? 1 : 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4549
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4550
	cur_rx = tp->cur_rx;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4551
	rx_left = NUM_RX_DESC + tp->dirty_rx - cur_rx;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4552
	rx_left = min(rx_left, budget);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4553
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4554
	for (; rx_left > 0; rx_left--, cur_rx++) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4555
		unsigned int entry = cur_rx % NUM_RX_DESC;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4556
		struct RxDesc *desc = tp->RxDescArray + entry;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4557
		u32 status;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4558
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4559
		rmb();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4560
		status = le32_to_cpu(desc->opts1);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4561
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4562
		if (status & DescOwn)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4563
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4564
		if (unlikely(status & RxRES)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4565
			netif_info(tp, rx_err, dev, "Rx ERROR. status = %08x\n",
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4566
				   status);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4567
			dev->stats.rx_errors++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4568
			if (status & (RxRWT | RxRUNT))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4569
				dev->stats.rx_length_errors++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4570
			if (status & RxCRC)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4571
				dev->stats.rx_crc_errors++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4572
			if (status & RxFOVF) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4573
				if (!tp->ecdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4574
					rtl8169_schedule_work(dev, rtl8169_reset_task);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4575
				dev->stats.rx_fifo_errors++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4576
			}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4577
			rtl8169_mark_to_asic(desc, rx_buf_sz);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4578
		} else {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4579
			struct sk_buff *skb;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4580
			dma_addr_t addr = le64_to_cpu(desc->addr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4581
			int pkt_size = (status & 0x00001FFF) - 4;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4582
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4583
			/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4584
			 * The driver does not support incoming fragmented
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4585
			 * frames. They are seen as a symptom of over-mtu
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4586
			 * sized frames.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4587
			 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4588
			if (unlikely(rtl8169_fragmented_frame(status))) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4589
				dev->stats.rx_dropped++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4590
				dev->stats.rx_length_errors++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4591
				rtl8169_mark_to_asic(desc, rx_buf_sz);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4592
				continue;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4593
			}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4594
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4595
			if (tp->ecdev) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4596
				/* reusing parts of rtl8169_try_rx_copy() */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4597
                struct device *d = &tp->pci_dev->dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4598
				void *data = rtl8169_align(tp->Rx_databuff[entry]);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4599
				dma_sync_single_for_cpu(d, addr, pkt_size, DMA_FROM_DEVICE);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4600
				prefetch(data);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4601
				ecdev_receive(tp->ecdev, data, pkt_size);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4602
				dma_sync_single_for_device(d, addr, pkt_size, DMA_FROM_DEVICE);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4603
			} else {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4604
				skb = rtl8169_try_rx_copy(tp->Rx_databuff[entry],
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4605
							  tp, pkt_size, addr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4606
				rtl8169_mark_to_asic(desc, rx_buf_sz);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4607
				if (!skb) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4608
					dev->stats.rx_dropped++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4609
					continue;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4610
				}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4611
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4612
				rtl8169_rx_csum(skb, status);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4613
				skb_put(skb, pkt_size);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4614
				skb->protocol = eth_type_trans(skb, dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4615
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4616
				if (rtl8169_rx_vlan_skb(tp, desc, skb, polling) < 0) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4617
					if (likely(polling))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4618
						napi_gro_receive(&tp->napi, skb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4619
					else
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4620
						netif_rx(skb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4621
				}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4622
			}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4623
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4624
			dev->stats.rx_bytes += pkt_size;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4625
			dev->stats.rx_packets++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4626
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4627
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4628
		/* Work around for AMD plateform. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4629
		if ((desc->opts2 & cpu_to_le32(0xfffe000)) &&
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4630
		    (tp->mac_version == RTL_GIGA_MAC_VER_05)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4631
			desc->opts2 = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4632
			cur_rx++;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4633
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4634
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4635
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4636
	count = cur_rx - tp->cur_rx;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4637
	tp->cur_rx = cur_rx;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4638
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4639
	tp->dirty_rx += count;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4640
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4641
	return count;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4642
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4643
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4644
static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4645
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4646
	struct net_device *dev = dev_instance;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4647
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4648
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4649
	int handled = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4650
	int status;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4651
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4652
	/* loop handling interrupts until we have no new ones or
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4653
	 * we hit a invalid/hotplug case.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4654
	 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4655
	status = RTL_R16(IntrStatus);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4656
	while (status && status != 0xffff) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4657
		handled = 1;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4658
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4659
		/* Handle all of the error cases first. These will reset
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4660
		 * the chip, so just exit the loop.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4661
		 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4662
		if (unlikely(!tp->ecdev && !netif_running(dev))) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4663
			rtl8169_asic_down(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4664
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4665
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4666
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4667
		if (unlikely(status & RxFIFOOver)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4668
			switch (tp->mac_version) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4669
			/* Work around for rx fifo overflow */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4670
			case RTL_GIGA_MAC_VER_11:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4671
			case RTL_GIGA_MAC_VER_22:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4672
			case RTL_GIGA_MAC_VER_26:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4673
				netif_stop_queue(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4674
				rtl8169_tx_timeout(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4675
				goto done;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4676
			/* Testers needed. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4677
			case RTL_GIGA_MAC_VER_17:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4678
			case RTL_GIGA_MAC_VER_19:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4679
			case RTL_GIGA_MAC_VER_20:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4680
			case RTL_GIGA_MAC_VER_21:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4681
			case RTL_GIGA_MAC_VER_23:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4682
			case RTL_GIGA_MAC_VER_24:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4683
			case RTL_GIGA_MAC_VER_27:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4684
			/* Experimental science. Pktgen proof. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4685
			case RTL_GIGA_MAC_VER_12:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4686
			case RTL_GIGA_MAC_VER_25:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4687
				if (status == RxFIFOOver)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4688
					goto done;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4689
				break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4690
			default:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4691
				break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4692
			}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4693
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4694
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4695
		if (unlikely(status & SYSErr)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4696
			rtl8169_pcierr_interrupt(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4697
			break;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4698
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4699
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4700
		if (status & LinkChg)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4701
			__rtl8169_check_link_status(dev, tp, ioaddr, true);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4702
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4703
		/* We need to see the lastest version of tp->intr_mask to
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4704
		 * avoid ignoring an MSI interrupt and having to wait for
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4705
		 * another event which may never come.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4706
		 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4707
		smp_rmb();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4708
		if (status & tp->intr_mask & tp->napi_event) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4709
			RTL_W16(IntrMask, tp->intr_event & ~tp->napi_event);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4710
			tp->intr_mask = ~tp->napi_event;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4711
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4712
			if (likely(napi_schedule_prep(&tp->napi)))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4713
				__napi_schedule(&tp->napi);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4714
			else
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4715
				netif_info(tp, intr, dev,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4716
					   "interrupt %04x in poll\n", status);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4717
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4718
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4719
		/* We only get a new MSI interrupt when all active irq
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4720
		 * sources on the chip have been acknowledged. So, ack
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4721
		 * everything we've seen and check if new sources have become
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4722
		 * active to avoid blocking all interrupts from the chip.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4723
		 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4724
		RTL_W16(IntrStatus,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4725
			(status & RxFIFOOver) ? (status | RxOverflow) : status);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4726
		status = RTL_R16(IntrStatus);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4727
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4728
done:
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4729
	return IRQ_RETVAL(handled);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4730
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4731
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4732
static void ec_poll(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4733
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4734
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4735
	struct pci_dev *pdev = tp->pci_dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4736
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4737
	rtl8169_interrupt(pdev->irq, dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4738
	rtl8169_rx_interrupt(dev, tp, tp->mmio_addr, 100); // FIXME
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4739
	rtl8169_tx_interrupt(dev, tp, tp->mmio_addr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4740
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4741
	if (jiffies - tp->ec_watchdog_jiffies >= 2 * HZ) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4742
		rtl8169_phy_timer((unsigned long) dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4743
		tp->ec_watchdog_jiffies = jiffies;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4744
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4745
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4746
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4747
static int rtl8169_poll(struct napi_struct *napi, int budget)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4748
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4749
	struct rtl8169_private *tp = container_of(napi, struct rtl8169_private, napi);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4750
	struct net_device *dev = tp->dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4751
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4752
	int work_done;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4753
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4754
	work_done = rtl8169_rx_interrupt(dev, tp, ioaddr, (u32) budget);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4755
	rtl8169_tx_interrupt(dev, tp, ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4756
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4757
	if (work_done < budget) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4758
		napi_complete(napi);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4759
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4760
		/* We need for force the visibility of tp->intr_mask
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4761
		 * for other CPUs, as we can loose an MSI interrupt
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4762
		 * and potentially wait for a retransmit timeout if we don't.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4763
		 * The posted write to IntrMask is safe, as it will
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4764
		 * eventually make it to the chip and we won't loose anything
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4765
		 * until it does.
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4766
		 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4767
		tp->intr_mask = 0xffff;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4768
		wmb();
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4769
		RTL_W16(IntrMask, tp->intr_event);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4770
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4771
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4772
	return work_done;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4773
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4774
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4775
static void rtl8169_rx_missed(struct net_device *dev, void __iomem *ioaddr)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4776
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4777
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4778
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4779
	if (tp->mac_version > RTL_GIGA_MAC_VER_06)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4780
		return;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4781
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4782
	dev->stats.rx_missed_errors += (RTL_R32(RxMissed) & 0xffffff);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4783
	RTL_W32(RxMissed, 0);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4784
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4785
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4786
static void rtl8169_down(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4787
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4788
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4789
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4790
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4791
	rtl8169_delete_timer(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4792
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4793
	if (!tp->ecdev) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4794
		netif_stop_queue(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4795
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4796
		napi_disable(&tp->napi);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4797
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4798
		spin_lock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4799
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4800
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4801
	rtl8169_asic_down(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4802
	/*
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4803
	 * At this point device interrupts can not be enabled in any function,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4804
	 * as netif_running is not true (rtl8169_interrupt, rtl8169_reset_task,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4805
	 * rtl8169_reinit_task) and napi is disabled (rtl8169_poll).
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4806
	 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4807
	rtl8169_rx_missed(dev, ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4808
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4809
	if (!tp->ecdev) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4810
		spin_unlock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4811
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4812
		synchronize_irq(dev->irq);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4813
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4814
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4815
	/* Give a racing hard_start_xmit a few cycles to complete. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4816
	synchronize_sched();  /* FIXME: should this be synchronize_irq()? */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4817
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4818
	rtl8169_tx_clear(tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4819
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4820
	rtl8169_rx_clear(tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4821
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4822
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4823
static int rtl8169_close(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4824
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4825
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4826
	struct pci_dev *pdev = tp->pci_dev;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4827
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4828
	pm_runtime_get_sync(&pdev->dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4829
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4830
	/* update counters before going down */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4831
	rtl8169_update_counters(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4832
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4833
	rtl8169_down(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4834
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4835
	if (!tp->ecdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4836
		free_irq(dev->irq, dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4837
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4838
	dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4839
			  tp->RxPhyAddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4840
	dma_free_coherent(&pdev->dev, R8169_TX_RING_BYTES, tp->TxDescArray,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4841
			  tp->TxPhyAddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4842
	tp->TxDescArray = NULL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4843
	tp->RxDescArray = NULL;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4844
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4845
	pm_runtime_put_sync(&pdev->dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4846
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4847
	return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4848
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4849
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4850
static void rtl_set_rx_mode(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4851
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4852
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4853
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4854
	unsigned long flags;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4855
	u32 mc_filter[2];	/* Multicast hash filter */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4856
	int rx_mode;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4857
	u32 tmp = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4858
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4859
	if (dev->flags & IFF_PROMISC) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4860
		/* Unconditionally log net taps. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4861
		netif_notice(tp, link, dev, "Promiscuous mode enabled\n");
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4862
		rx_mode =
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4863
		    AcceptBroadcast | AcceptMulticast | AcceptMyPhys |
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4864
		    AcceptAllPhys;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4865
		mc_filter[1] = mc_filter[0] = 0xffffffff;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4866
	} else if ((netdev_mc_count(dev) > multicast_filter_limit) ||
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4867
		   (dev->flags & IFF_ALLMULTI)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4868
		/* Too many to filter perfectly -- accept all multicasts. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4869
		rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4870
		mc_filter[1] = mc_filter[0] = 0xffffffff;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4871
	} else {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4872
		struct netdev_hw_addr *ha;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4873
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4874
		rx_mode = AcceptBroadcast | AcceptMyPhys;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4875
		mc_filter[1] = mc_filter[0] = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4876
		netdev_for_each_mc_addr(ha, dev) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4877
			int bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4878
			mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4879
			rx_mode |= AcceptMulticast;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4880
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4881
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4882
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4883
	spin_lock_irqsave(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4884
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4885
	tmp = rtl8169_rx_config | rx_mode |
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4886
	      (RTL_R32(RxConfig) & rtl_chip_info[tp->chipset].RxConfigMask);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4887
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4888
	if (tp->mac_version > RTL_GIGA_MAC_VER_06) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4889
		u32 data = mc_filter[0];
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4890
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4891
		mc_filter[0] = swab32(mc_filter[1]);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4892
		mc_filter[1] = swab32(data);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4893
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4894
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4895
	RTL_W32(MAR0 + 4, mc_filter[1]);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4896
	RTL_W32(MAR0 + 0, mc_filter[0]);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4897
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4898
	RTL_W32(RxConfig, tmp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4899
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4900
	spin_unlock_irqrestore(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4901
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4902
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4903
/**
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4904
 *  rtl8169_get_stats - Get rtl8169 read/write statistics
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4905
 *  @dev: The Ethernet Device to get statistics for
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4906
 *
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4907
 *  Get TX/RX statistics for rtl8169
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4908
 */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4909
static struct net_device_stats *rtl8169_get_stats(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4910
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4911
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4912
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4913
	unsigned long flags;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4914
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4915
	if (netif_running(dev)) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4916
		spin_lock_irqsave(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4917
		rtl8169_rx_missed(dev, ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4918
		spin_unlock_irqrestore(&tp->lock, flags);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4919
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4920
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4921
	return &dev->stats;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4922
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4923
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4924
static void rtl8169_net_suspend(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4925
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4926
	if (!netif_running(dev))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4927
		return;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4928
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4929
	netif_device_detach(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4930
	netif_stop_queue(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4931
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4932
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4933
#ifdef CONFIG_PM
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4934
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4935
static int rtl8169_suspend(struct device *device)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4936
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4937
	struct pci_dev *pdev = to_pci_dev(device);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4938
	struct net_device *dev = pci_get_drvdata(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4939
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4940
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4941
	if (tp->ecdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4942
		return -EBUSY;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4943
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4944
	rtl8169_net_suspend(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4945
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4946
	return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4947
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4948
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4949
static void __rtl8169_resume(struct net_device *dev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4950
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4951
	netif_device_attach(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4952
	rtl8169_schedule_work(dev, rtl8169_reset_task);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4953
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4954
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4955
static int rtl8169_resume(struct device *device)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4956
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4957
	struct pci_dev *pdev = to_pci_dev(device);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4958
	struct net_device *dev = pci_get_drvdata(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4959
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4960
2254
fe87d02a6790 Fixed suspend/resume for r8169 drivers.
Florian Pose <fp@igh-essen.com>
parents: 2186
diff changeset
  4961
	if (tp->ecdev)
fe87d02a6790 Fixed suspend/resume for r8169 drivers.
Florian Pose <fp@igh-essen.com>
parents: 2186
diff changeset
  4962
		return -EBUSY;
fe87d02a6790 Fixed suspend/resume for r8169 drivers.
Florian Pose <fp@igh-essen.com>
parents: 2186
diff changeset
  4963
2186
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4964
	rtl8169_init_phy(dev, tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4965
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4966
	if (netif_running(dev))
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4967
		__rtl8169_resume(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4968
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4969
	return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4970
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4971
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4972
static int rtl8169_runtime_suspend(struct device *device)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4973
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4974
	struct pci_dev *pdev = to_pci_dev(device);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4975
	struct net_device *dev = pci_get_drvdata(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4976
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4977
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4978
	if (!tp->TxDescArray)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4979
		return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4980
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4981
	spin_lock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4982
	tp->saved_wolopts = __rtl8169_get_wol(tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4983
	__rtl8169_set_wol(tp, WAKE_ANY);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4984
	spin_unlock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4985
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4986
	rtl8169_net_suspend(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4987
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4988
	return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4989
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4990
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4991
static int rtl8169_runtime_resume(struct device *device)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4992
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4993
	struct pci_dev *pdev = to_pci_dev(device);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4994
	struct net_device *dev = pci_get_drvdata(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4995
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4996
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4997
	if (!tp->TxDescArray)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4998
		return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4999
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5000
	spin_lock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5001
	__rtl8169_set_wol(tp, tp->saved_wolopts);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5002
	tp->saved_wolopts = 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5003
	spin_unlock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5004
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5005
	rtl8169_init_phy(dev, tp);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5006
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5007
	__rtl8169_resume(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5008
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5009
	return 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5010
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5011
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5012
static int rtl8169_runtime_idle(struct device *device)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5013
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5014
	struct pci_dev *pdev = to_pci_dev(device);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5015
	struct net_device *dev = pci_get_drvdata(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5016
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5017
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5018
	return tp->TxDescArray ? -EBUSY : 0;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5019
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5020
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5021
static const struct dev_pm_ops rtl8169_pm_ops = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5022
	.suspend = rtl8169_suspend,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5023
	.resume = rtl8169_resume,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5024
	.freeze = rtl8169_suspend,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5025
	.thaw = rtl8169_resume,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5026
	.poweroff = rtl8169_suspend,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5027
	.restore = rtl8169_resume,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5028
	.runtime_suspend = rtl8169_runtime_suspend,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5029
	.runtime_resume = rtl8169_runtime_resume,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5030
	.runtime_idle = rtl8169_runtime_idle,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5031
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5032
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5033
#define RTL8169_PM_OPS	(&rtl8169_pm_ops)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5034
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5035
#else /* !CONFIG_PM */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5036
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5037
#define RTL8169_PM_OPS	NULL
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5038
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5039
#endif /* !CONFIG_PM */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5040
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5041
static void rtl_shutdown(struct pci_dev *pdev)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5042
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5043
	struct net_device *dev = pci_get_drvdata(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5044
	struct rtl8169_private *tp = netdev_priv(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5045
	void __iomem *ioaddr = tp->mmio_addr;
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5046
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5047
	rtl8169_net_suspend(dev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5048
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5049
	/* restore original MAC address */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5050
	rtl_rar_set(tp, dev->perm_addr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5051
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5052
	spin_lock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5053
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5054
	rtl8169_asic_down(ioaddr);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5055
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5056
	spin_unlock_irq(&tp->lock);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5057
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5058
	if (system_state == SYSTEM_POWER_OFF) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5059
		/* WoL fails with some 8168 when the receiver is disabled. */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5060
		if (tp->features & RTL_FEATURE_WOL) {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5061
			pci_clear_master(pdev);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5062
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5063
			RTL_W8(ChipCmd, CmdRxEnb);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5064
			/* PCI commit */
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5065
			RTL_R8(ChipCmd);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5066
		}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5067
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5068
		pci_wake_from_d3(pdev, true);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5069
		pci_set_power_state(pdev, PCI_D3hot);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5070
	}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5071
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5072
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5073
static struct pci_driver rtl8169_pci_driver = {
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5074
	.name		= MODULENAME,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5075
	.id_table	= rtl8169_pci_tbl,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5076
	.probe		= rtl8169_init_one,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5077
	.remove		= __devexit_p(rtl8169_remove_one),
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5078
	.shutdown	= rtl_shutdown,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5079
	.driver.pm	= RTL8169_PM_OPS,
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5080
};
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5081
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5082
static int __init rtl8169_init_module(void)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5083
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5084
	return pci_register_driver(&rtl8169_pci_driver);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5085
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5086
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5087
static void __exit rtl8169_cleanup_module(void)
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5088
{
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5089
	pci_unregister_driver(&rtl8169_pci_driver);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5090
}
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5091
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5092
module_init(rtl8169_init_module);
064fe2a6835c Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5093
module_exit(rtl8169_cleanup_module);