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

revert "limit rx processing to one frame per poll", which caused etherlab
frame timeouts in setups with more than one frame per cycle.
2224
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/*
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
 * r8169.c: RealTek 8169/8168/8101 ethernet driver.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
 *
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     4
 * Copyright (c) 2002 ShuChen <shuchen@realtek.com.tw>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     5
 * Copyright (c) 2003 - 2007 Francois Romieu <romieu@fr.zoreil.com>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     6
 * Copyright (c) a lot of people too. Please respect their work.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     7
 *
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     8
 * See MAINTAINERS file for support contact information.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     9
 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    10
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    11
#include <linux/module.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    12
#include <linux/moduleparam.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    13
#include <linux/pci.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    14
#include <linux/netdevice.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    15
#include <linux/etherdevice.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    16
#include <linux/delay.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    17
#include <linux/ethtool.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    18
#include <linux/mii.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    19
#include <linux/if_vlan.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
#include <linux/crc32.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
#include <linux/in.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    22
#include <linux/ip.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    23
#include <linux/tcp.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    24
#include <linux/init.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    25
#include <linux/dma-mapping.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    26
#include <linux/pm_runtime.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    27
#include <linux/pci-aspm.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
#include <asm/system.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
#include <asm/io.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
#include <asm/irq.h>
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
#include "../globals.h"
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
#include "ecdev.h"
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
#define RTL8169_VERSION "2.3LK-NAPI"
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
#define MODULENAME "ec_r8169"
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    37
#define PFX MODULENAME ": "
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    38
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
#ifdef RTL8169_DEBUG
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
#define assert(expr) \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
	if (!(expr)) {					\
4f6670f083f1 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",	\
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
		#expr,__FILE__,__func__,__LINE__);		\
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
#define dprintk(fmt, args...) \
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    47
#else
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    48
#define assert(expr) do {} while (0)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    49
#define dprintk(fmt, args...)	do {} while (0)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    50
#endif /* RTL8169_DEBUG */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    51
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
#define R8169_MSG_DEFAULT \
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    54
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    55
#define TX_BUFFS_AVAIL(tp) \
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    57
4f6670f083f1 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).
4f6670f083f1 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. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
static const int multicast_filter_limit = 32;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
/* MAC address length */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    63
#define MAC_ADDR_LEN	6
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    64
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    65
#define MAX_READ_REQUEST_SHIFT	12
4f6670f083f1 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. */
4f6670f083f1 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 */
4f6670f083f1 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 */
4f6670f083f1 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 */
4f6670f083f1 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 */
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    73
#define R8169_REGS_SIZE		256
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    74
#define R8169_NAPI_WEIGHT	64
4f6670f083f1 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 */
4f6670f083f1 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 */
4f6670f083f1 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 */
4f6670f083f1 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))
4f6670f083f1 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))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    80
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    81
#define RTL8169_TX_TIMEOUT	(6*HZ)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    82
#define RTL8169_PHY_TIMEOUT	(10*HZ)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    83
4f6670f083f1 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)
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
#define RTL_EEPROM_SIG_ADDR	0x0000
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    87
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    88
/* write/read MMIO register */
4f6670f083f1 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))
4f6670f083f1 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))
4f6670f083f1 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))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
#define RTL_R8(reg)		readb (ioaddr + (reg))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    93
#define RTL_R16(reg)		readw (ioaddr + (reg))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    94
#define RTL_R32(reg)		readl (ioaddr + (reg))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    95
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
enum mac_version {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    97
	RTL_GIGA_MAC_NONE   = 0x00,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    98
	RTL_GIGA_MAC_VER_01 = 0x01, // 8169
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    99
	RTL_GIGA_MAC_VER_02 = 0x02, // 8169S
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   100
	RTL_GIGA_MAC_VER_03 = 0x03, // 8110S
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   101
	RTL_GIGA_MAC_VER_04 = 0x04, // 8169SB
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   102
	RTL_GIGA_MAC_VER_05 = 0x05, // 8110SCd
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   103
	RTL_GIGA_MAC_VER_06 = 0x06, // 8110SCe
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   104
	RTL_GIGA_MAC_VER_07 = 0x07, // 8102e
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   105
	RTL_GIGA_MAC_VER_08 = 0x08, // 8102e
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   106
	RTL_GIGA_MAC_VER_09 = 0x09, // 8102e
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   107
	RTL_GIGA_MAC_VER_10 = 0x0a, // 8101e
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   108
	RTL_GIGA_MAC_VER_11 = 0x0b, // 8168Bb
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   109
	RTL_GIGA_MAC_VER_12 = 0x0c, // 8168Be
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   110
	RTL_GIGA_MAC_VER_13 = 0x0d, // 8101Eb
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   111
	RTL_GIGA_MAC_VER_14 = 0x0e, // 8101 ?
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   112
	RTL_GIGA_MAC_VER_15 = 0x0f, // 8101 ?
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   113
	RTL_GIGA_MAC_VER_16 = 0x11, // 8101Ec
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   114
	RTL_GIGA_MAC_VER_17 = 0x10, // 8168Bf
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   115
	RTL_GIGA_MAC_VER_18 = 0x12, // 8168CP
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
	RTL_GIGA_MAC_VER_19 = 0x13, // 8168C
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
	RTL_GIGA_MAC_VER_20 = 0x14, // 8168C
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   118
	RTL_GIGA_MAC_VER_21 = 0x15, // 8168C
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
	RTL_GIGA_MAC_VER_22 = 0x16, // 8168C
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
	RTL_GIGA_MAC_VER_23 = 0x17, // 8168CP
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   121
	RTL_GIGA_MAC_VER_24 = 0x18, // 8168CP
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
	RTL_GIGA_MAC_VER_25 = 0x19, // 8168D
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   123
	RTL_GIGA_MAC_VER_26 = 0x1a, // 8168D
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   124
	RTL_GIGA_MAC_VER_27 = 0x1b  // 8168DP
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   126
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   127
#define _R(NAME,MAC,MASK) \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   128
	{ .name = NAME, .mac_version = MAC, .RxConfigMask = MASK }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   129
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   130
static const struct {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   131
	const char *name;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   132
	u8 mac_version;
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   134
} rtl_chip_info[] = {
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   153
	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_19, 0xff7e1880), // PCI-E
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   154
	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_20, 0xff7e1880), // PCI-E
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   162
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   163
#undef _R
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   164
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   165
enum cfg_version {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
	RTL_CFG_0 = 0x00,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   167
	RTL_CFG_1,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
	RTL_CFG_2
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   169
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   170
4f6670f083f1 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 *);
4f6670f083f1 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 *);
4f6670f083f1 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 *);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   174
4f6670f083f1 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) = {
4f6670f083f1 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 },
4f6670f083f1 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 },
4f6670f083f1 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 },
4f6670f083f1 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 },
4f6670f083f1 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 },
4f6670f083f1 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 },
4f6670f083f1 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 },
4f6670f083f1 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 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   184
	{ PCI_VENDOR_ID_LINKSYS,		0x1032,
4f6670f083f1 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 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
	{ 0x0001,				0x8168,
4f6670f083f1 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 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   188
	{0,},
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   189
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   190
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   191
/* prevent driver from being loaded automatically */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   192
//MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   194
static int rx_buf_sz = 16383;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   195
static int use_dac;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
static struct {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
	u32 msg_enable;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   198
} debug = { -1 };
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   200
enum rtl_registers {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   201
	MAC0		= 0,	/* Ethernet hardware address. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   202
	MAC4		= 4,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   203
	MAR0		= 8,	/* Multicast filter. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   204
	CounterAddrLow		= 0x10,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   205
	CounterAddrHigh		= 0x14,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   206
	TxDescStartAddrLow	= 0x20,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   207
	TxDescStartAddrHigh	= 0x24,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   208
	TxHDescStartAddrLow	= 0x28,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   209
	TxHDescStartAddrHigh	= 0x2c,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   210
	FLASH		= 0x30,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   211
	ERSR		= 0x36,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   212
	ChipCmd		= 0x37,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   213
	TxPoll		= 0x38,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   214
	IntrMask	= 0x3c,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   215
	IntrStatus	= 0x3e,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   216
	TxConfig	= 0x40,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   217
	RxConfig	= 0x44,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   218
	RxMissed	= 0x4c,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   219
	Cfg9346		= 0x50,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   220
	Config0		= 0x51,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   221
	Config1		= 0x52,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   222
	Config2		= 0x53,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   223
	Config3		= 0x54,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   224
	Config4		= 0x55,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   225
	Config5		= 0x56,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   226
	MultiIntr	= 0x5c,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   227
	PHYAR		= 0x60,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   228
	PHYstatus	= 0x6c,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   229
	RxMaxSize	= 0xda,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   230
	CPlusCmd	= 0xe0,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   231
	IntrMitigate	= 0xe2,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   232
	RxDescAddrLow	= 0xe4,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   233
	RxDescAddrHigh	= 0xe8,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   234
	EarlyTxThres	= 0xec,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   235
	FuncEvent	= 0xf0,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   236
	FuncEventMask	= 0xf4,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   237
	FuncPresetState	= 0xf8,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   238
	FuncForceEvent	= 0xfc,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   239
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   240
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   241
enum rtl8110_registers {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   242
	TBICSR			= 0x64,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   243
	TBI_ANAR		= 0x68,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   244
	TBI_LPAR		= 0x6a,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   245
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   246
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   247
enum rtl8168_8101_registers {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   248
	CSIDR			= 0x64,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
	CSIAR			= 0x68,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   250
#define	CSIAR_FLAG			0x80000000
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   251
#define	CSIAR_WRITE_CMD			0x80000000
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   252
#define	CSIAR_BYTE_ENABLE		0x0f
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   253
#define	CSIAR_BYTE_ENABLE_SHIFT		12
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   254
#define	CSIAR_ADDR_MASK			0x0fff
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   255
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   256
	EPHYAR			= 0x80,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   257
#define	EPHYAR_FLAG			0x80000000
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   258
#define	EPHYAR_WRITE_CMD		0x80000000
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   259
#define	EPHYAR_REG_MASK			0x1f
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   260
#define	EPHYAR_REG_SHIFT		16
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
#define	EPHYAR_DATA_MASK		0xffff
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
	DBG_REG			= 0xd1,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
#define	FIX_NAK_1			(1 << 4)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   264
#define	FIX_NAK_2			(1 << 3)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   265
	EFUSEAR			= 0xdc,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   266
#define	EFUSEAR_FLAG			0x80000000
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   267
#define	EFUSEAR_WRITE_CMD		0x80000000
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   268
#define	EFUSEAR_READ_CMD		0x00000000
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   269
#define	EFUSEAR_REG_MASK		0x03ff
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   270
#define	EFUSEAR_REG_SHIFT		8
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   271
#define	EFUSEAR_DATA_MASK		0xff
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   272
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   273
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
enum rtl_register_content {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   275
	/* InterruptStatusBits */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   276
	SYSErr		= 0x8000,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
	PCSTimeout	= 0x4000,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
	SWInt		= 0x0100,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
	TxDescUnavail	= 0x0080,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   280
	RxFIFOOver	= 0x0040,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   281
	LinkChg		= 0x0020,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   282
	RxOverflow	= 0x0010,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   283
	TxErr		= 0x0008,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   284
	TxOK		= 0x0004,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   285
	RxErr		= 0x0002,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   286
	RxOK		= 0x0001,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   287
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   288
	/* RxStatusDesc */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   289
	RxFOVF	= (1 << 23),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   290
	RxRWT	= (1 << 22),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   291
	RxRES	= (1 << 21),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   292
	RxRUNT	= (1 << 20),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   293
	RxCRC	= (1 << 19),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   294
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   295
	/* ChipCmdBits */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   296
	CmdReset	= 0x10,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   297
	CmdRxEnb	= 0x08,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   298
	CmdTxEnb	= 0x04,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   299
	RxBufEmpty	= 0x01,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   300
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   301
	/* TXPoll register p.5 */
4f6670f083f1 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 */
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   304
	FSWInt		= 0x01,		/* Forced software interrupt */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   305
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   306
	/* Cfg9346Bits */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   307
	Cfg9346_Lock	= 0x00,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   308
	Cfg9346_Unlock	= 0xc0,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   309
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   310
	/* rx_mode_bits */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   311
	AcceptErr	= 0x20,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   312
	AcceptRunt	= 0x10,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   313
	AcceptBroadcast	= 0x08,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   314
	AcceptMulticast	= 0x04,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   315
	AcceptMyPhys	= 0x02,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   316
	AcceptAllPhys	= 0x01,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   317
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   318
	/* RxConfigBits */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   319
	RxCfgFIFOShift	= 13,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   320
	RxCfgDMAShift	=  8,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   321
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   322
	/* TxConfigBits */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   323
	TxInterFrameGapShift = 24,
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   325
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   326
	/* Config1 register p.24 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   327
	LEDS1		= (1 << 7),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   328
	LEDS0		= (1 << 6),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   329
	MSIEnable	= (1 << 5),	/* Enable Message Signaled Interrupt */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   330
	Speed_down	= (1 << 4),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   331
	MEMMAP		= (1 << 3),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   332
	IOMAP		= (1 << 2),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   333
	VPD		= (1 << 1),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   334
	PMEnable	= (1 << 0),	/* Power Management Enable */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   335
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   336
	/* Config2 register p. 25 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   337
	PCI_Clock_66MHz = 0x01,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   338
	PCI_Clock_33MHz = 0x00,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   339
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   340
	/* Config3 register p.25 */
4f6670f083f1 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 */
4f6670f083f1 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 */
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   344
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   345
	/* Config5 register p.27 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   346
	BWF		= (1 << 6),	/* Accept Broadcast wakeup frame */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   347
	MWF		= (1 << 5),	/* Accept Multicast wakeup frame */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   348
	UWF		= (1 << 4),	/* Accept Unicast wakeup frame */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   349
	LanWake		= (1 << 1),	/* LanWake enable/disable */
4f6670f083f1 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# */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   352
	/* TBICSR p.28 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   353
	TBIReset	= 0x80000000,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   354
	TBILoopback	= 0x40000000,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   355
	TBINwEnable	= 0x20000000,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
	TBINwRestart	= 0x10000000,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
	TBILinkOk	= 0x02000000,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   358
	TBINwComplete	= 0x01000000,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
	/* CPlusCmd p.31 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   361
	EnableBist	= (1 << 15),	// 8168 8101
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
	Mac_dbgo_oe	= (1 << 14),	// 8168 8101
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   363
	Normal_mode	= (1 << 13),	// unused
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
	Force_half_dup	= (1 << 12),	// 8168 8101
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   365
	Force_rxflow_en	= (1 << 11),	// 8168 8101
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   366
	Force_txflow_en	= (1 << 10),	// 8168 8101
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   367
	Cxpl_dbg_sel	= (1 << 9),	// 8168 8101
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   368
	ASF		= (1 << 8),	// 8168 8101
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   369
	PktCntrDisable	= (1 << 7),	// 8168 8101
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
	Mac_dbgo_sel	= 0x001c,	// 8168
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   371
	RxVlan		= (1 << 6),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
	RxChkSum	= (1 << 5),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
	PCIDAC		= (1 << 4),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   374
	PCIMulRW	= (1 << 3),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   375
	INTT_0		= 0x0000,	// 8168
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
	INTT_1		= 0x0001,	// 8168
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
	INTT_2		= 0x0002,	// 8168
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   378
	INTT_3		= 0x0003,	// 8168
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   379
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
	/* rtl8169_PHYstatus */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
	TBI_Enable	= 0x80,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   382
	TxFlowCtrl	= 0x40,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   383
	RxFlowCtrl	= 0x20,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   384
	_1000bpsF	= 0x10,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   385
	_100bps		= 0x08,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   386
	_10bps		= 0x04,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   387
	LinkStatus	= 0x02,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   388
	FullDup		= 0x01,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   389
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   390
	/* _TBICSRBit */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
	TBILinkOK	= 0x02000000,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   392
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   393
	/* DumpCounterCommand */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   394
	CounterDump	= 0x8,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   395
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   396
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   397
enum desc_status_bit {
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
	RingEnd		= (1 << 30), /* End of descriptor ring */
4f6670f083f1 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 */
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   402
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   403
	/* Tx private */
4f6670f083f1 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) */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
	MSSShift	= 16,        /* MSS value position */
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   407
	IPCS		= (1 << 18), /* Calculate IP checksum */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   408
	UDPCS		= (1 << 17), /* Calculate UDP/IP checksum */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   409
	TCPCS		= (1 << 16), /* Calculate TCP/IP checksum */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   410
	TxVlanTag	= (1 << 17), /* Add VLAN tag */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   411
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   412
	/* Rx private */
4f6670f083f1 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 */
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   415
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   416
#define RxProtoUDP	(PID1)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   417
#define RxProtoTCP	(PID0)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   418
#define RxProtoIP	(PID1 | PID0)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   419
#define RxProtoMask	RxProtoIP
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   420
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   421
	IPFail		= (1 << 16), /* IP checksum failed */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   422
	UDPFail		= (1 << 15), /* UDP/IP checksum failed */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   423
	TCPFail		= (1 << 14), /* TCP/IP checksum failed */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   424
	RxVlanTag	= (1 << 16), /* VLAN tag available */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   425
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   426
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   427
#define RsvdMask	0x3fffc000
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   428
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   429
struct TxDesc {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   430
	__le32 opts1;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   431
	__le32 opts2;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   432
	__le64 addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   433
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   434
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   435
struct RxDesc {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   436
	__le32 opts1;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   437
	__le32 opts2;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   438
	__le64 addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   439
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   440
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   441
struct ring_info {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   442
	struct sk_buff	*skb;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   443
	u32		len;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   444
	u8		__pad[sizeof(void *) - sizeof(u32)];
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   445
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   446
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   447
enum features {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   448
	RTL_FEATURE_WOL		= (1 << 0),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   449
	RTL_FEATURE_MSI		= (1 << 1),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   450
	RTL_FEATURE_GMII	= (1 << 2),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   451
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   452
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   453
struct rtl8169_counters {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   454
	__le64	tx_packets;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   455
	__le64	rx_packets;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   456
	__le64	tx_errors;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   457
	__le32	rx_errors;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   458
	__le16	rx_missed;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
	__le16	align_errors;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   460
	__le32	tx_one_collision;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   461
	__le32	tx_multi_collision;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   462
	__le64	rx_unicast;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   463
	__le64	rx_broadcast;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   464
	__le32	rx_multicast;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   465
	__le16	tx_aborted;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   466
	__le16	tx_underun;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   467
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   468
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   469
struct rtl8169_private {
4f6670f083f1 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 */
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   472
	struct net_device *dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   473
	struct napi_struct napi;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   474
	spinlock_t lock;		/* spin lock flag */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   475
	u32 msg_enable;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   476
	int chipset;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   477
	int mac_version;
4f6670f083f1 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. */
4f6670f083f1 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. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   480
	u32 dirty_rx;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   481
	u32 dirty_tx;
4f6670f083f1 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 */
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   484
	dma_addr_t TxPhyAddr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   485
	dma_addr_t RxPhyAddr;
4f6670f083f1 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 */
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   488
	struct timer_list timer;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   489
	u16 cp_cmd;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   490
	u16 intr_event;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   491
	u16 napi_event;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   492
	u16 intr_mask;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   493
	int phy_1000_ctrl_reg;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   494
#ifdef CONFIG_R8169_VLAN
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   495
	struct vlan_group *vlgrp;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   496
#endif
4f6670f083f1 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);
4f6670f083f1 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 *);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   499
	void (*phy_reset_enable)(void __iomem *);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   500
	void (*hw_start)(struct net_device *);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   501
	unsigned int (*phy_reset_pending)(void __iomem *);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   502
	unsigned int (*link_ok)(void __iomem *);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   504
	int pcie_cap;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   505
	struct delayed_work task;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   506
	unsigned features;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   507
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   508
	struct mii_if_info mii;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   509
	struct rtl8169_counters counters;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   510
	u32 saved_wolopts;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   511
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   512
	ec_device_t *ecdev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   513
	unsigned long ec_watchdog_jiffies;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   514
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   515
4f6670f083f1 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>");
4f6670f083f1 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)");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   518
module_param(use_dac, int, 0);
4f6670f083f1 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.");
4f6670f083f1 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);
4f6670f083f1 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)");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   522
MODULE_LICENSE("GPL");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   523
MODULE_VERSION(EC_MASTER_VERSION);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   524
4f6670f083f1 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);
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   527
				      struct net_device *dev);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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 *,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   536
				void __iomem *, u32 budget);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   542
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   543
static const unsigned int rtl8169_rx_config =
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   545
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   547
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   548
	int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   549
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   550
	RTL_W32(PHYAR, 0x80000000 | (reg_addr & 0x1f) << 16 | (value & 0xffff));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   551
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   552
	for (i = 20; i > 0; i--) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   553
		/*
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   554
		 * Check if the RTL8169 has completed writing to the specified
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   555
		 * MII register.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   556
		 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   557
		if (!(RTL_R32(PHYAR) & 0x80000000))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   558
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   559
		udelay(25);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   560
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   561
	/*
4f6670f083f1 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
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   563
	 * complete indication, but before sending next command.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   564
	 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   565
	udelay(20);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   566
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   567
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   569
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   570
	int i, value = -1;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   571
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   572
	RTL_W32(PHYAR, 0x0 | (reg_addr & 0x1f) << 16);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   573
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   574
	for (i = 20; i > 0; i--) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   575
		/*
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   576
		 * Check if the RTL8169 has completed retrieving data from
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   577
		 * the specified MII register.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   578
		 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   579
		if (RTL_R32(PHYAR) & 0x80000000) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   580
			value = RTL_R32(PHYAR) & 0xffff;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   581
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   582
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   583
		udelay(25);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   584
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   585
	/*
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   586
	 * According to hardware specs a 20us delay is required after read
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   587
	 * complete indication, but before sending next command.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   588
	 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   589
	udelay(20);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   590
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   591
	return value;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   592
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   593
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   594
static void mdio_patch(void __iomem *ioaddr, int reg_addr, int value)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   595
{
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   597
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   598
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   599
static void mdio_plus_minus(void __iomem *ioaddr, int reg_addr, int p, int m)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   600
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   601
	int val;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   602
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   603
	val = mdio_read(ioaddr, reg_addr);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   605
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   606
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   608
			   int val)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   609
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   610
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   611
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   612
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   613
	mdio_write(ioaddr, location, val);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   614
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   615
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   616
static int rtl_mdio_read(struct net_device *dev, int phy_id, int location)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   617
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   618
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   619
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   620
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   621
	return mdio_read(ioaddr, location);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   622
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   623
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   624
static void rtl_ephy_write(void __iomem *ioaddr, int reg_addr, int value)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   625
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   626
	unsigned int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   627
4f6670f083f1 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) |
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   630
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   631
	for (i = 0; i < 100; i++) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   632
		if (!(RTL_R32(EPHYAR) & EPHYAR_FLAG))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   633
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   634
		udelay(10);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   635
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   636
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   637
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   638
static u16 rtl_ephy_read(void __iomem *ioaddr, int reg_addr)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   639
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   640
	u16 value = 0xffff;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   641
	unsigned int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   642
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   643
	RTL_W32(EPHYAR, (reg_addr & EPHYAR_REG_MASK) << EPHYAR_REG_SHIFT);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   644
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   645
	for (i = 0; i < 100; i++) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   646
		if (RTL_R32(EPHYAR) & EPHYAR_FLAG) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   647
			value = RTL_R32(EPHYAR) & EPHYAR_DATA_MASK;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   648
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   649
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   650
		udelay(10);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   651
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   652
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   653
	return value;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   654
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   655
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   657
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   658
	unsigned int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   659
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   660
	RTL_W32(CSIDR, value);
4f6670f083f1 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) |
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   662
		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   663
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   664
	for (i = 0; i < 100; i++) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   665
		if (!(RTL_R32(CSIAR) & CSIAR_FLAG))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   666
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   667
		udelay(10);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   668
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   669
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   670
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   672
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   673
	u32 value = ~0x00;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   674
	unsigned int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   675
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   676
	RTL_W32(CSIAR, (addr & CSIAR_ADDR_MASK) |
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   677
		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   678
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   679
	for (i = 0; i < 100; i++) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   680
		if (RTL_R32(CSIAR) & CSIAR_FLAG) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   681
			value = RTL_R32(CSIDR);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   682
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   683
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   684
		udelay(10);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   685
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   686
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   687
	return value;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   688
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   689
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   690
static u8 rtl8168d_efuse_read(void __iomem *ioaddr, int reg_addr)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   691
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   692
	u8 value = 0xff;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   693
	unsigned int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   694
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   695
	RTL_W32(EFUSEAR, (reg_addr & EFUSEAR_REG_MASK) << EFUSEAR_REG_SHIFT);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   696
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   697
	for (i = 0; i < 300; i++) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   698
		if (RTL_R32(EFUSEAR) & EFUSEAR_FLAG) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   699
			value = RTL_R32(EFUSEAR) & EFUSEAR_DATA_MASK;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   700
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   701
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   702
		udelay(100);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   703
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   704
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   705
	return value;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   706
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   707
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   708
static void rtl8169_irq_mask_and_ack(void __iomem *ioaddr)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   709
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   710
	RTL_W16(IntrMask, 0x0000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   711
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   712
	RTL_W16(IntrStatus, 0xffff);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   713
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   714
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   715
static void rtl8169_asic_down(void __iomem *ioaddr)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   716
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   717
	RTL_W8(ChipCmd, 0x00);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   718
	rtl8169_irq_mask_and_ack(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   719
	RTL_R16(CPlusCmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   720
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   721
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   722
static unsigned int rtl8169_tbi_reset_pending(void __iomem *ioaddr)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   723
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   724
	return RTL_R32(TBICSR) & TBIReset;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   725
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   726
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   727
static unsigned int rtl8169_xmii_reset_pending(void __iomem *ioaddr)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   728
{
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   730
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   731
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   732
static unsigned int rtl8169_tbi_link_ok(void __iomem *ioaddr)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   733
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   734
	return RTL_R32(TBICSR) & TBILinkOk;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   735
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   736
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   737
static unsigned int rtl8169_xmii_link_ok(void __iomem *ioaddr)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   738
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   739
	return RTL_R8(PHYstatus) & LinkStatus;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   740
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   741
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   742
static void rtl8169_tbi_reset_enable(void __iomem *ioaddr)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   743
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   744
	RTL_W32(TBICSR, RTL_R32(TBICSR) | TBIReset);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   745
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   746
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   747
static void rtl8169_xmii_reset_enable(void __iomem *ioaddr)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   748
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   749
	unsigned int val;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   750
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   752
	mdio_write(ioaddr, MII_BMCR, val & 0xffff);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   753
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   754
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   755
static void __rtl8169_check_link_status(struct net_device *dev,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   756
				      struct rtl8169_private *tp,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   757
				      void __iomem *ioaddr,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   758
				      bool pm)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   759
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   760
	unsigned long flags;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   761
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   762
	if (tp->ecdev) {
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   764
		return;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   765
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   766
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   767
	spin_lock_irqsave(&tp->lock, flags);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   768
	if (tp->link_ok(ioaddr)) {
4f6670f083f1 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. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   770
		if (pm)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   771
			pm_request_resume(&tp->pci_dev->dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   772
		netif_carrier_on(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   773
		if (net_ratelimit())
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   775
	} else {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   776
		netif_carrier_off(dev);
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   778
		if (pm)
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   780
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   781
	spin_unlock_irqrestore(&tp->lock, flags);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   782
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   783
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   785
				      struct rtl8169_private *tp,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   786
				      void __iomem *ioaddr)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   787
{
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   789
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   790
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   791
#define WAKE_ANY (WAKE_PHY | WAKE_MAGIC | WAKE_UCAST | WAKE_BCAST | WAKE_MCAST)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   792
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   794
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   795
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   796
	u8 options;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   797
	u32 wolopts = 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   798
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   799
	options = RTL_R8(Config1);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   800
	if (!(options & PMEnable))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   801
		return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   802
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   803
	options = RTL_R8(Config3);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   804
	if (options & LinkUp)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   805
		wolopts |= WAKE_PHY;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   806
	if (options & MagicPacket)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   807
		wolopts |= WAKE_MAGIC;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   808
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   809
	options = RTL_R8(Config5);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   810
	if (options & UWF)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   811
		wolopts |= WAKE_UCAST;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   812
	if (options & BWF)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   813
		wolopts |= WAKE_BCAST;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   814
	if (options & MWF)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   815
		wolopts |= WAKE_MCAST;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   816
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   817
	return wolopts;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   818
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   819
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   820
static void rtl8169_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   821
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   822
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   823
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   824
	spin_lock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   825
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   826
	wol->supported = WAKE_ANY;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   827
	wol->wolopts = __rtl8169_get_wol(tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   828
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   829
	spin_unlock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   830
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   831
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   833
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   834
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   835
	unsigned int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   836
	static const struct {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   837
		u32 opt;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   838
		u16 reg;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   839
		u8  mask;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   840
	} cfg[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   841
		{ WAKE_ANY,   Config1, PMEnable },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   842
		{ WAKE_PHY,   Config3, LinkUp },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   843
		{ WAKE_MAGIC, Config3, MagicPacket },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   844
		{ WAKE_UCAST, Config5, UWF },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   845
		{ WAKE_BCAST, Config5, BWF },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   846
		{ WAKE_MCAST, Config5, MWF },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   847
		{ WAKE_ANY,   Config5, LanWake }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   848
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   849
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   850
	RTL_W8(Cfg9346, Cfg9346_Unlock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   851
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   852
	for (i = 0; i < ARRAY_SIZE(cfg); i++) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   853
		u8 options = RTL_R8(cfg[i].reg) & ~cfg[i].mask;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   854
		if (wolopts & cfg[i].opt)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   855
			options |= cfg[i].mask;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   856
		RTL_W8(cfg[i].reg, options);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   857
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   858
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   859
	RTL_W8(Cfg9346, Cfg9346_Lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   860
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   861
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   863
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   864
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   865
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   866
	spin_lock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   867
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   868
	if (wol->wolopts)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   869
		tp->features |= RTL_FEATURE_WOL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   870
	else
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   871
		tp->features &= ~RTL_FEATURE_WOL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   872
	__rtl8169_set_wol(tp, wol->wolopts);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   873
	spin_unlock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   874
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   876
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   877
	return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   878
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   879
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   880
static void rtl8169_get_drvinfo(struct net_device *dev,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   881
				struct ethtool_drvinfo *info)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   882
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   883
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   884
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   885
	strcpy(info->driver, MODULENAME);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   886
	strcpy(info->version, RTL8169_VERSION);
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   888
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   889
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   891
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   892
	return R8169_REGS_SIZE;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   893
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   894
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   896
				 u8 autoneg, u16 speed, u8 duplex)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   897
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   898
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   899
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   900
	int ret = 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   901
	u32 reg;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   902
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   903
	reg = RTL_R32(TBICSR);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   904
	if ((autoneg == AUTONEG_DISABLE) && (speed == SPEED_1000) &&
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   905
	    (duplex == DUPLEX_FULL)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   906
		RTL_W32(TBICSR, reg & ~(TBINwEnable | TBINwRestart));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   907
	} else if (autoneg == AUTONEG_ENABLE)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   908
		RTL_W32(TBICSR, reg | TBINwEnable | TBINwRestart);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   909
	else {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   910
		netif_warn(tp, link, dev,
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   912
		ret = -EOPNOTSUPP;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   913
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   914
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   915
	return ret;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   916
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   917
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   919
				  u8 autoneg, u16 speed, u8 duplex)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   920
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   921
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   922
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   923
	int giga_ctrl, bmcr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   924
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   925
	if (autoneg == AUTONEG_ENABLE) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   926
		int auto_nego;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   927
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   928
		auto_nego = mdio_read(ioaddr, MII_ADVERTISE);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   929
		auto_nego |= (ADVERTISE_10HALF | ADVERTISE_10FULL |
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   930
			      ADVERTISE_100HALF | ADVERTISE_100FULL);
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   932
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   933
		giga_ctrl = mdio_read(ioaddr, MII_CTRL1000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   934
		giga_ctrl &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   935
4f6670f083f1 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. */
4f6670f083f1 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) &&
4f6670f083f1 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) &&
4f6670f083f1 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) &&
4f6670f083f1 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) &&
4f6670f083f1 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) &&
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   942
		    (tp->mac_version != RTL_GIGA_MAC_VER_14) &&
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   943
		    (tp->mac_version != RTL_GIGA_MAC_VER_15) &&
4f6670f083f1 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)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   945
			giga_ctrl |= ADVERTISE_1000FULL | ADVERTISE_1000HALF;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   946
		} else {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   947
			netif_info(tp, link, dev,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   948
				   "PHY does not support 1000Mbps\n");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   949
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   950
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   951
		bmcr = BMCR_ANENABLE | BMCR_ANRESTART;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   952
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   953
		if ((tp->mac_version == RTL_GIGA_MAC_VER_11) ||
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   954
		    (tp->mac_version == RTL_GIGA_MAC_VER_12) ||
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   955
		    (tp->mac_version >= RTL_GIGA_MAC_VER_17)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   956
			/*
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   957
			 * Wake up the PHY.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   958
			 * Vendor specific (0x1f) and reserved (0x0e) MII
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   959
			 * registers.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   960
			 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   961
			mdio_write(ioaddr, 0x1f, 0x0000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   962
			mdio_write(ioaddr, 0x0e, 0x0000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   963
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   964
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   965
		mdio_write(ioaddr, MII_ADVERTISE, auto_nego);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   966
		mdio_write(ioaddr, MII_CTRL1000, giga_ctrl);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   967
	} else {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   968
		giga_ctrl = 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   969
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   970
		if (speed == SPEED_10)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   971
			bmcr = 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   972
		else if (speed == SPEED_100)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   973
			bmcr = BMCR_SPEED100;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   974
		else
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   975
			return -EINVAL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   976
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   977
		if (duplex == DUPLEX_FULL)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   978
			bmcr |= BMCR_FULLDPLX;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   979
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   980
		mdio_write(ioaddr, 0x1f, 0x0000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   981
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   982
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   983
	tp->phy_1000_ctrl_reg = giga_ctrl;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   984
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   985
	mdio_write(ioaddr, MII_BMCR, bmcr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   986
4f6670f083f1 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) ||
4f6670f083f1 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)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   989
		if ((speed == SPEED_100) && (autoneg != AUTONEG_ENABLE)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   990
			mdio_write(ioaddr, 0x17, 0x2138);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   991
			mdio_write(ioaddr, 0x0e, 0x0260);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   992
		} else {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   993
			mdio_write(ioaddr, 0x17, 0x2108);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   994
			mdio_write(ioaddr, 0x0e, 0x0000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   995
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   996
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   997
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   998
	return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   999
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1000
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1002
			     u8 autoneg, u16 speed, u8 duplex)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1003
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1004
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1005
	int ret;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1006
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1008
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1009
	if (netif_running(dev) && (tp->phy_1000_ctrl_reg & ADVERTISE_1000FULL))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1010
		mod_timer(&tp->timer, jiffies + RTL8169_PHY_TIMEOUT);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1011
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1012
	return ret;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1013
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1014
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1015
static int rtl8169_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1016
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1017
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1018
	unsigned long flags;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1019
	int ret;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1020
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1021
	spin_lock_irqsave(&tp->lock, flags);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1023
	spin_unlock_irqrestore(&tp->lock, flags);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1024
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1025
	return ret;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1026
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1027
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1029
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1030
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1031
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1032
	return tp->cp_cmd & RxChkSum;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1033
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1034
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1036
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1037
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1038
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1039
	unsigned long flags;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1040
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1041
	spin_lock_irqsave(&tp->lock, flags);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1042
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1043
	if (data)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1044
		tp->cp_cmd |= RxChkSum;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1045
	else
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1046
		tp->cp_cmd &= ~RxChkSum;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1047
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1048
	RTL_W16(CPlusCmd, tp->cp_cmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1049
	RTL_R16(CPlusCmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1050
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1051
	spin_unlock_irqrestore(&tp->lock, flags);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1052
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1053
	return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1054
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1055
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1056
#ifdef CONFIG_R8169_VLAN
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1057
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1059
				      struct sk_buff *skb)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1060
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1061
	return (vlan_tx_tag_present(skb)) ?
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1063
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1064
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1065
static void rtl8169_vlan_rx_register(struct net_device *dev,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1066
				     struct vlan_group *grp)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1067
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1068
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1069
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1070
	unsigned long flags;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1071
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1072
	spin_lock_irqsave(&tp->lock, flags);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1073
	tp->vlgrp = grp;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1074
	/*
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1075
	 * Do not disable RxVlan on 8110SCd.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1076
	 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1077
	if (tp->vlgrp || (tp->mac_version == RTL_GIGA_MAC_VER_05))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1078
		tp->cp_cmd |= RxVlan;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1079
	else
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1080
		tp->cp_cmd &= ~RxVlan;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1081
	RTL_W16(CPlusCmd, tp->cp_cmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1082
	RTL_R16(CPlusCmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1083
	spin_unlock_irqrestore(&tp->lock, flags);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1084
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1085
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1087
			       struct sk_buff *skb, int polling)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1088
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1089
	u32 opts2 = le32_to_cpu(desc->opts2);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1090
	struct vlan_group *vlgrp = tp->vlgrp;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1091
	int ret;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1092
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1093
	if (vlgrp && (opts2 & RxVlanTag)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1094
		u16 vtag = swab16(opts2 & 0xffff);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1095
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1096
		if (likely(polling))
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1098
		else
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1099
			__vlan_hwaccel_rx(skb, vlgrp, vtag, polling);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1100
		ret = 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1101
	} else
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1102
		ret = -1;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1103
	desc->opts2 = 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1104
	return ret;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1105
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1106
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1107
#else /* !CONFIG_R8169_VLAN */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1108
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1109
static inline u32 rtl8169_tx_vlan_tag(struct rtl8169_private *tp,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1110
				      struct sk_buff *skb)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1111
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1112
	return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1113
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1114
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1116
			       struct sk_buff *skb, int polling)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1117
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1118
	return -1;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1119
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1120
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1121
#endif
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1122
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1124
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1125
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1126
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1127
	u32 status;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1128
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1129
	cmd->supported =
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1130
		SUPPORTED_1000baseT_Full | SUPPORTED_Autoneg | SUPPORTED_FIBRE;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1131
	cmd->port = PORT_FIBRE;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1132
	cmd->transceiver = XCVR_INTERNAL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1133
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1134
	status = RTL_R32(TBICSR);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1135
	cmd->advertising = (status & TBINwEnable) ?  ADVERTISED_Autoneg : 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1136
	cmd->autoneg = !!(status & TBINwEnable);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1137
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1138
	cmd->speed = SPEED_1000;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1139
	cmd->duplex = DUPLEX_FULL; /* Always set */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1140
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1141
	return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1142
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1143
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1145
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1146
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1147
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1148
	return mii_ethtool_gset(&tp->mii, cmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1149
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1150
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1152
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1153
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1154
	unsigned long flags;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1155
	int rc;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1156
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1157
	spin_lock_irqsave(&tp->lock, flags);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1158
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1159
	rc = tp->get_settings(dev, cmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1160
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1161
	spin_unlock_irqrestore(&tp->lock, flags);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1162
	return rc;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1163
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1164
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1166
			     void *p)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1167
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1168
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1169
	unsigned long flags;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1170
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1171
	if (regs->len > R8169_REGS_SIZE)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1172
		regs->len = R8169_REGS_SIZE;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1173
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1174
	spin_lock_irqsave(&tp->lock, flags);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1176
	spin_unlock_irqrestore(&tp->lock, flags);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1177
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1178
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1180
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1181
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1182
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1183
	return tp->msg_enable;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1184
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1185
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1187
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1188
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1189
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1190
	tp->msg_enable = value;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1191
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1192
4f6670f083f1 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] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1194
	"tx_packets",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1195
	"rx_packets",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1196
	"tx_errors",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1197
	"rx_errors",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1198
	"rx_missed",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1199
	"align_errors",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1200
	"tx_single_collisions",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1201
	"tx_multi_collisions",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1202
	"unicast",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1203
	"broadcast",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1204
	"multicast",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1205
	"tx_aborted",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1206
	"tx_underrun",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1207
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1208
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1209
static int rtl8169_get_sset_count(struct net_device *dev, int sset)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1210
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1211
	switch (sset) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1212
	case ETH_SS_STATS:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1213
		return ARRAY_SIZE(rtl8169_gstrings);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1214
	default:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1215
		return -EOPNOTSUPP;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1216
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1217
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1218
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1220
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1221
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1222
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1223
	struct rtl8169_counters *counters;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1224
	dma_addr_t paddr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1225
	u32 cmd;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1226
	int wait = 1000;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1227
	struct device *d = &tp->pci_dev->dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1228
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1229
	/*
4f6670f083f1 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
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1231
	 * is disabled.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1232
	 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1233
	if ((RTL_R8(ChipCmd) & CmdRxEnb) == 0)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1234
		return;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1235
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1237
	if (!counters)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1238
		return;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1239
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1240
	RTL_W32(CounterAddrHigh, (u64)paddr >> 32);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1241
	cmd = (u64)paddr & DMA_BIT_MASK(32);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1242
	RTL_W32(CounterAddrLow, cmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1243
	RTL_W32(CounterAddrLow, cmd | CounterDump);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1244
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1245
	while (wait--) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1246
		if ((RTL_R32(CounterAddrLow) & CounterDump) == 0) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1247
			/* copy updated counters */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1248
			memcpy(&tp->counters, counters, sizeof(*counters));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1249
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1250
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1251
		udelay(10);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1252
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1253
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1254
	RTL_W32(CounterAddrLow, 0);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1255
	RTL_W32(CounterAddrHigh, 0);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1256
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1257
	dma_free_coherent(d, sizeof(*counters), counters, paddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1258
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1259
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1261
				      struct ethtool_stats *stats, u64 *data)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1262
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1263
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1264
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1265
	ASSERT_RTNL();
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1266
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1267
	rtl8169_update_counters(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1268
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1282
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1283
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1285
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1286
	switch(stringset) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1287
	case ETH_SS_STATS:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1288
		memcpy(data, *rtl8169_gstrings, sizeof(rtl8169_gstrings));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1289
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1290
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1291
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1292
4f6670f083f1 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 = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1294
	.get_drvinfo		= rtl8169_get_drvinfo,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1295
	.get_regs_len		= rtl8169_get_regs_len,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1296
	.get_link		= ethtool_op_get_link,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1297
	.get_settings		= rtl8169_get_settings,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1298
	.set_settings		= rtl8169_set_settings,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1299
	.get_msglevel		= rtl8169_get_msglevel,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1300
	.set_msglevel		= rtl8169_set_msglevel,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1301
	.get_rx_csum		= rtl8169_get_rx_csum,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1302
	.set_rx_csum		= rtl8169_set_rx_csum,
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1304
	.set_sg			= ethtool_op_set_sg,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1305
	.set_tso		= ethtool_op_set_tso,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1306
	.get_regs		= rtl8169_get_regs,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1307
	.get_wol		= rtl8169_get_wol,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1308
	.set_wol		= rtl8169_set_wol,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1309
	.get_strings		= rtl8169_get_strings,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1310
	.get_sset_count		= rtl8169_get_sset_count,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1311
	.get_ethtool_stats	= rtl8169_get_ethtool_stats,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1312
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1313
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1314
static void rtl8169_get_mac_version(struct rtl8169_private *tp,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1315
				    void __iomem *ioaddr)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1316
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1317
	/*
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1320
	 * if needed:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1321
	 *
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1322
	 * (RTL_R32(TxConfig) & 0x700000) == 0x500000 ? 8168Bf : 8168Be
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1323
	 *
4f6670f083f1 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:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1325
	 *
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1326
	 * (RTL_R32(TxConfig) & 0x700000) == 0x200000 ? 8101Eb : 8101Ec
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1327
	 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1328
	static const struct {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1329
		u32 mask;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1330
		u32 val;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1331
		int mac_version;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1332
	} mac_info[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1333
		/* 8168D family. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1334
		{ 0x7cf00000, 0x28300000,	RTL_GIGA_MAC_VER_26 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1335
		{ 0x7cf00000, 0x28100000,	RTL_GIGA_MAC_VER_25 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1336
		{ 0x7c800000, 0x28800000,	RTL_GIGA_MAC_VER_27 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1337
		{ 0x7c800000, 0x28000000,	RTL_GIGA_MAC_VER_26 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1338
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1339
		/* 8168C family. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1340
		{ 0x7cf00000, 0x3cb00000,	RTL_GIGA_MAC_VER_24 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1341
		{ 0x7cf00000, 0x3c900000,	RTL_GIGA_MAC_VER_23 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1342
		{ 0x7cf00000, 0x3c800000,	RTL_GIGA_MAC_VER_18 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1343
		{ 0x7c800000, 0x3c800000,	RTL_GIGA_MAC_VER_24 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1344
		{ 0x7cf00000, 0x3c000000,	RTL_GIGA_MAC_VER_19 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1345
		{ 0x7cf00000, 0x3c200000,	RTL_GIGA_MAC_VER_20 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1346
		{ 0x7cf00000, 0x3c300000,	RTL_GIGA_MAC_VER_21 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1347
		{ 0x7cf00000, 0x3c400000,	RTL_GIGA_MAC_VER_22 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1348
		{ 0x7c800000, 0x3c000000,	RTL_GIGA_MAC_VER_22 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1349
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1350
		/* 8168B family. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1351
		{ 0x7cf00000, 0x38000000,	RTL_GIGA_MAC_VER_12 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1352
		{ 0x7cf00000, 0x38500000,	RTL_GIGA_MAC_VER_17 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1353
		{ 0x7c800000, 0x38000000,	RTL_GIGA_MAC_VER_17 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1354
		{ 0x7c800000, 0x30000000,	RTL_GIGA_MAC_VER_11 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1355
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1356
		/* 8101 family. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1357
		{ 0x7cf00000, 0x34a00000,	RTL_GIGA_MAC_VER_09 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1358
		{ 0x7cf00000, 0x24a00000,	RTL_GIGA_MAC_VER_09 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1359
		{ 0x7cf00000, 0x34900000,	RTL_GIGA_MAC_VER_08 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1360
		{ 0x7cf00000, 0x24900000,	RTL_GIGA_MAC_VER_08 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1361
		{ 0x7cf00000, 0x34800000,	RTL_GIGA_MAC_VER_07 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1362
		{ 0x7cf00000, 0x24800000,	RTL_GIGA_MAC_VER_07 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1363
		{ 0x7cf00000, 0x34000000,	RTL_GIGA_MAC_VER_13 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1364
		{ 0x7cf00000, 0x34300000,	RTL_GIGA_MAC_VER_10 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1365
		{ 0x7cf00000, 0x34200000,	RTL_GIGA_MAC_VER_16 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1366
		{ 0x7c800000, 0x34800000,	RTL_GIGA_MAC_VER_09 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1367
		{ 0x7c800000, 0x24800000,	RTL_GIGA_MAC_VER_09 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1368
		{ 0x7c800000, 0x34000000,	RTL_GIGA_MAC_VER_16 },
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1370
		{ 0xfc800000, 0x38800000,	RTL_GIGA_MAC_VER_15 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1371
		{ 0xfc800000, 0x30800000,	RTL_GIGA_MAC_VER_14 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1372
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1373
		/* 8110 family. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1374
		{ 0xfc800000, 0x98000000,	RTL_GIGA_MAC_VER_06 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1375
		{ 0xfc800000, 0x18000000,	RTL_GIGA_MAC_VER_05 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1376
		{ 0xfc800000, 0x10000000,	RTL_GIGA_MAC_VER_04 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1377
		{ 0xfc800000, 0x04000000,	RTL_GIGA_MAC_VER_03 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1378
		{ 0xfc800000, 0x00800000,	RTL_GIGA_MAC_VER_02 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1379
		{ 0xfc800000, 0x00000000,	RTL_GIGA_MAC_VER_01 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1380
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1381
		/* Catch-all */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1382
		{ 0x00000000, 0x00000000,	RTL_GIGA_MAC_NONE   }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1383
	}, *p = mac_info;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1384
	u32 reg;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1385
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1386
	reg = RTL_R32(TxConfig);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1387
	while ((reg & p->mask) != p->val)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1388
		p++;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1389
	tp->mac_version = p->mac_version;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1390
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1391
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1392
static void rtl8169_print_mac_version(struct rtl8169_private *tp)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1393
{
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1395
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1396
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1397
struct phy_reg {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1398
	u16 reg;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1399
	u16 val;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1400
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1401
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1403
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1404
	while (len-- > 0) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1405
		mdio_write(ioaddr, regs->reg, regs->val);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1406
		regs++;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1407
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1408
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1409
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1411
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1413
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1414
		{ 0x06, 0x006e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1415
		{ 0x08, 0x0708 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1416
		{ 0x15, 0x4000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1417
		{ 0x18, 0x65c7 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1418
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1419
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1420
		{ 0x03, 0x00a1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1421
		{ 0x02, 0x0008 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1422
		{ 0x01, 0x0120 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1423
		{ 0x00, 0x1000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1424
		{ 0x04, 0x0800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1425
		{ 0x04, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1426
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1427
		{ 0x03, 0xff41 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1428
		{ 0x02, 0xdf60 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1429
		{ 0x01, 0x0140 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1430
		{ 0x00, 0x0077 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1431
		{ 0x04, 0x7800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1432
		{ 0x04, 0x7000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1433
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1434
		{ 0x03, 0x802f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1435
		{ 0x02, 0x4f02 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1436
		{ 0x01, 0x0409 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1437
		{ 0x00, 0xf0f9 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1438
		{ 0x04, 0x9800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1439
		{ 0x04, 0x9000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1440
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1441
		{ 0x03, 0xdf01 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1442
		{ 0x02, 0xdf20 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1443
		{ 0x01, 0xff95 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1444
		{ 0x00, 0xba00 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1445
		{ 0x04, 0xa800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1446
		{ 0x04, 0xa000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1447
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1448
		{ 0x03, 0xff41 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1449
		{ 0x02, 0xdf20 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1450
		{ 0x01, 0x0140 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1451
		{ 0x00, 0x00bb },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1452
		{ 0x04, 0xb800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1453
		{ 0x04, 0xb000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1454
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1455
		{ 0x03, 0xdf41 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1456
		{ 0x02, 0xdc60 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1457
		{ 0x01, 0x6340 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1458
		{ 0x00, 0x007d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1459
		{ 0x04, 0xd800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1460
		{ 0x04, 0xd000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1461
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1462
		{ 0x03, 0xdf01 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1463
		{ 0x02, 0xdf20 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1464
		{ 0x01, 0x100a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1465
		{ 0x00, 0xa0ff },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1466
		{ 0x04, 0xf800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1467
		{ 0x04, 0xf000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1468
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1469
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1470
		{ 0x0b, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1471
		{ 0x00, 0x9200 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1472
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1473
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1475
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1476
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1478
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1479
	static const struct phy_reg phy_reg_init[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1480
		{ 0x1f, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1481
		{ 0x01, 0x90d0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1482
		{ 0x1f, 0x0000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1483
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1484
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1485
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1486
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1487
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1488
static void rtl8169scd_hw_phy_config_quirk(struct rtl8169_private *tp,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1489
					   void __iomem *ioaddr)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1490
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1491
	struct pci_dev *pdev = tp->pci_dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1492
	u16 vendor_id, device_id;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1493
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1496
4f6670f083f1 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))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1498
		return;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1499
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1500
	mdio_write(ioaddr, 0x1f, 0x0001);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1501
	mdio_write(ioaddr, 0x10, 0xf01b);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1502
	mdio_write(ioaddr, 0x1f, 0x0000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1503
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1504
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1506
				     void __iomem *ioaddr)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1507
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1509
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1510
		{ 0x04, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1511
		{ 0x03, 0x00a1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1512
		{ 0x02, 0x0008 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1513
		{ 0x01, 0x0120 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1514
		{ 0x00, 0x1000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1515
		{ 0x04, 0x0800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1516
		{ 0x04, 0x9000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1517
		{ 0x03, 0x802f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1518
		{ 0x02, 0x4f02 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1519
		{ 0x01, 0x0409 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1520
		{ 0x00, 0xf099 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1521
		{ 0x04, 0x9800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1522
		{ 0x04, 0xa000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1523
		{ 0x03, 0xdf01 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1524
		{ 0x02, 0xdf20 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1525
		{ 0x01, 0xff95 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1526
		{ 0x00, 0xba00 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1527
		{ 0x04, 0xa800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1528
		{ 0x04, 0xf000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1529
		{ 0x03, 0xdf01 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1530
		{ 0x02, 0xdf20 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1531
		{ 0x01, 0x101a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1532
		{ 0x00, 0xa0ff },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1533
		{ 0x04, 0xf800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1534
		{ 0x04, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1535
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1536
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1537
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1538
		{ 0x10, 0xf41b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1539
		{ 0x14, 0xfb54 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1540
		{ 0x18, 0xf5c7 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1541
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1542
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1543
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1544
		{ 0x17, 0x0cc0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1545
		{ 0x1f, 0x0000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1546
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1547
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1549
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1550
	rtl8169scd_hw_phy_config_quirk(tp, ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1551
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1552
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1554
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1556
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1557
		{ 0x04, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1558
		{ 0x03, 0x00a1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1559
		{ 0x02, 0x0008 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1560
		{ 0x01, 0x0120 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1561
		{ 0x00, 0x1000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1562
		{ 0x04, 0x0800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1563
		{ 0x04, 0x9000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1564
		{ 0x03, 0x802f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1565
		{ 0x02, 0x4f02 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1566
		{ 0x01, 0x0409 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1567
		{ 0x00, 0xf099 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1568
		{ 0x04, 0x9800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1569
		{ 0x04, 0xa000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1570
		{ 0x03, 0xdf01 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1571
		{ 0x02, 0xdf20 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1572
		{ 0x01, 0xff95 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1573
		{ 0x00, 0xba00 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1574
		{ 0x04, 0xa800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1575
		{ 0x04, 0xf000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1576
		{ 0x03, 0xdf01 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1577
		{ 0x02, 0xdf20 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1578
		{ 0x01, 0x101a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1579
		{ 0x00, 0xa0ff },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1580
		{ 0x04, 0xf800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1581
		{ 0x04, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1582
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1583
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1584
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1585
		{ 0x0b, 0x8480 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1586
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1587
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1588
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1589
		{ 0x18, 0x67c7 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1590
		{ 0x04, 0x2000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1591
		{ 0x03, 0x002f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1592
		{ 0x02, 0x4360 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1593
		{ 0x01, 0x0109 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1594
		{ 0x00, 0x3022 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1595
		{ 0x04, 0x2800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1596
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1597
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1598
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1599
		{ 0x17, 0x0cc0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1600
		{ 0x1f, 0x0000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1601
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1602
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1604
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1605
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1606
static void rtl8168bb_hw_phy_config(void __iomem *ioaddr)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1607
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1609
		{ 0x10, 0xf41b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1610
		{ 0x1f, 0x0000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1611
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1612
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1613
	mdio_write(ioaddr, 0x1f, 0x0001);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1614
	mdio_patch(ioaddr, 0x16, 1 << 0);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1615
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1617
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1618
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1620
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1622
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1623
		{ 0x10, 0xf41b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1624
		{ 0x1f, 0x0000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1625
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1626
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1627
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1628
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1629
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1630
static void rtl8168cp_1_hw_phy_config(void __iomem *ioaddr)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1631
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1633
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1634
		{ 0x1d, 0x0f00 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1635
		{ 0x1f, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1636
		{ 0x0c, 0x1ec8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1637
		{ 0x1f, 0x0000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1638
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1639
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1641
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1642
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1643
static void rtl8168cp_2_hw_phy_config(void __iomem *ioaddr)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1644
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1646
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1647
		{ 0x1d, 0x3d98 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1648
		{ 0x1f, 0x0000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1649
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1650
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1651
	mdio_write(ioaddr, 0x1f, 0x0000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1652
	mdio_patch(ioaddr, 0x14, 1 << 5);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1653
	mdio_patch(ioaddr, 0x0d, 1 << 5);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1654
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1656
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1657
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1659
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1661
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1662
		{ 0x12, 0x2300 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1663
		{ 0x1f, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1664
		{ 0x00, 0x88d4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1665
		{ 0x01, 0x82b1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1666
		{ 0x03, 0x7002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1667
		{ 0x08, 0x9e30 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1668
		{ 0x09, 0x01f0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1669
		{ 0x0a, 0x5500 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1670
		{ 0x0c, 0x00c8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1671
		{ 0x1f, 0x0003 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1672
		{ 0x12, 0xc096 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1673
		{ 0x16, 0x000a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1674
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1675
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1676
		{ 0x09, 0x2000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1677
		{ 0x09, 0x0000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1678
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1679
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1681
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1682
	mdio_patch(ioaddr, 0x14, 1 << 5);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1683
	mdio_patch(ioaddr, 0x0d, 1 << 5);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1684
	mdio_write(ioaddr, 0x1f, 0x0000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1685
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1686
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1688
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1690
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1691
		{ 0x12, 0x2300 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1692
		{ 0x03, 0x802f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1693
		{ 0x02, 0x4f02 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1694
		{ 0x01, 0x0409 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1695
		{ 0x00, 0xf099 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1696
		{ 0x04, 0x9800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1697
		{ 0x04, 0x9000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1698
		{ 0x1d, 0x3d98 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1699
		{ 0x1f, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1700
		{ 0x0c, 0x7eb8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1701
		{ 0x06, 0x0761 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1702
		{ 0x1f, 0x0003 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1703
		{ 0x16, 0x0f0a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1704
		{ 0x1f, 0x0000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1705
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1706
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1708
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1709
	mdio_patch(ioaddr, 0x16, 1 << 0);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1710
	mdio_patch(ioaddr, 0x14, 1 << 5);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1711
	mdio_patch(ioaddr, 0x0d, 1 << 5);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1712
	mdio_write(ioaddr, 0x1f, 0x0000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1713
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1714
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1716
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1717
	static const struct phy_reg phy_reg_init[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1718
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1719
		{ 0x12, 0x2300 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1720
		{ 0x1d, 0x3d98 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1721
		{ 0x1f, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1722
		{ 0x0c, 0x7eb8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1723
		{ 0x06, 0x5461 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1724
		{ 0x1f, 0x0003 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1725
		{ 0x16, 0x0f0a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1726
		{ 0x1f, 0x0000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1727
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1728
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1729
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1730
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1731
	mdio_patch(ioaddr, 0x16, 1 << 0);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1732
	mdio_patch(ioaddr, 0x14, 1 << 5);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1733
	mdio_patch(ioaddr, 0x0d, 1 << 5);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1734
	mdio_write(ioaddr, 0x1f, 0x0000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1735
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1736
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1738
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1739
	rtl8168c_3_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1740
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1741
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1743
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1745
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1746
		{ 0x06, 0x4064 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1747
		{ 0x07, 0x2863 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1748
		{ 0x08, 0x059c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1749
		{ 0x09, 0x26b4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1750
		{ 0x0a, 0x6a19 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1751
		{ 0x0b, 0xdcc8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1752
		{ 0x10, 0xf06d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1753
		{ 0x14, 0x7f68 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1754
		{ 0x18, 0x7fd9 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1755
		{ 0x1c, 0xf0ff },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1756
		{ 0x1d, 0x3d9c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1757
		{ 0x1f, 0x0003 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1758
		{ 0x12, 0xf49f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1759
		{ 0x13, 0x070b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1760
		{ 0x1a, 0x05ad },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1761
		{ 0x14, 0x94c0 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1762
	};
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1764
		{ 0x1f, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1765
		{ 0x06, 0x5561 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1766
		{ 0x1f, 0x0005 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1767
		{ 0x05, 0x8332 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1768
		{ 0x06, 0x5561 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1769
	};
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1771
		{ 0x1f, 0x0005 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1772
		{ 0x05, 0xffc2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1773
		{ 0x1f, 0x0005 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1774
		{ 0x05, 0x8000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1775
		{ 0x06, 0xf8f9 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1776
		{ 0x06, 0xfaef },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1777
		{ 0x06, 0x59ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1778
		{ 0x06, 0xf8ea },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1779
		{ 0x06, 0x00ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1780
		{ 0x06, 0xf8eb },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1781
		{ 0x06, 0x00e0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1782
		{ 0x06, 0xf87c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1783
		{ 0x06, 0xe1f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1784
		{ 0x06, 0x7d59 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1785
		{ 0x06, 0x0fef },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1786
		{ 0x06, 0x0139 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1787
		{ 0x06, 0x029e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1788
		{ 0x06, 0x06ef },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1789
		{ 0x06, 0x1039 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1790
		{ 0x06, 0x089f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1791
		{ 0x06, 0x2aee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1792
		{ 0x06, 0xf8ea },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1793
		{ 0x06, 0x00ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1794
		{ 0x06, 0xf8eb },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1795
		{ 0x06, 0x01e0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1796
		{ 0x06, 0xf87c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1797
		{ 0x06, 0xe1f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1798
		{ 0x06, 0x7d58 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1799
		{ 0x06, 0x409e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1800
		{ 0x06, 0x0f39 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1801
		{ 0x06, 0x46aa },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1802
		{ 0x06, 0x0bbf },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1803
		{ 0x06, 0x8290 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1804
		{ 0x06, 0xd682 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1805
		{ 0x06, 0x9802 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1806
		{ 0x06, 0x014f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1807
		{ 0x06, 0xae09 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1808
		{ 0x06, 0xbf82 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1809
		{ 0x06, 0x98d6 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1810
		{ 0x06, 0x82a0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1811
		{ 0x06, 0x0201 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1812
		{ 0x06, 0x4fef },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1813
		{ 0x06, 0x95fe },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1814
		{ 0x06, 0xfdfc },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1815
		{ 0x06, 0x05f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1816
		{ 0x06, 0xf9fa },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1817
		{ 0x06, 0xeef8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1818
		{ 0x06, 0xea00 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1819
		{ 0x06, 0xeef8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1820
		{ 0x06, 0xeb00 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1821
		{ 0x06, 0xe2f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1822
		{ 0x06, 0x7ce3 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1823
		{ 0x06, 0xf87d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1824
		{ 0x06, 0xa511 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1825
		{ 0x06, 0x1112 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1826
		{ 0x06, 0xd240 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1827
		{ 0x06, 0xd644 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1828
		{ 0x06, 0x4402 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1829
		{ 0x06, 0x8217 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1830
		{ 0x06, 0xd2a0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1831
		{ 0x06, 0xd6aa },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1832
		{ 0x06, 0xaa02 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1833
		{ 0x06, 0x8217 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1834
		{ 0x06, 0xae0f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1835
		{ 0x06, 0xa544 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1836
		{ 0x06, 0x4402 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1837
		{ 0x06, 0xae4d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1838
		{ 0x06, 0xa5aa },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1839
		{ 0x06, 0xaa02 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1840
		{ 0x06, 0xae47 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1841
		{ 0x06, 0xaf82 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1842
		{ 0x06, 0x13ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1843
		{ 0x06, 0x834e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1844
		{ 0x06, 0x00ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1845
		{ 0x06, 0x834d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1846
		{ 0x06, 0x0fee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1847
		{ 0x06, 0x834c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1848
		{ 0x06, 0x0fee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1849
		{ 0x06, 0x834f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1850
		{ 0x06, 0x00ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1851
		{ 0x06, 0x8351 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1852
		{ 0x06, 0x00ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1853
		{ 0x06, 0x834a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1854
		{ 0x06, 0xffee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1855
		{ 0x06, 0x834b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1856
		{ 0x06, 0xffe0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1857
		{ 0x06, 0x8330 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1858
		{ 0x06, 0xe183 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1859
		{ 0x06, 0x3158 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1860
		{ 0x06, 0xfee4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1861
		{ 0x06, 0xf88a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1862
		{ 0x06, 0xe5f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1863
		{ 0x06, 0x8be0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1864
		{ 0x06, 0x8332 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1865
		{ 0x06, 0xe183 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1866
		{ 0x06, 0x3359 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1867
		{ 0x06, 0x0fe2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1868
		{ 0x06, 0x834d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1869
		{ 0x06, 0x0c24 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1870
		{ 0x06, 0x5af0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1871
		{ 0x06, 0x1e12 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1872
		{ 0x06, 0xe4f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1873
		{ 0x06, 0x8ce5 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1874
		{ 0x06, 0xf88d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1875
		{ 0x06, 0xaf82 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1876
		{ 0x06, 0x13e0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1877
		{ 0x06, 0x834f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1878
		{ 0x06, 0x10e4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1879
		{ 0x06, 0x834f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1880
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1881
		{ 0x06, 0x4e78 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1882
		{ 0x06, 0x009f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1883
		{ 0x06, 0x0ae0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1884
		{ 0x06, 0x834f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1885
		{ 0x06, 0xa010 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1886
		{ 0x06, 0xa5ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1887
		{ 0x06, 0x834e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1888
		{ 0x06, 0x01e0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1889
		{ 0x06, 0x834e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1890
		{ 0x06, 0x7805 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1891
		{ 0x06, 0x9e9a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1892
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1893
		{ 0x06, 0x4e78 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1894
		{ 0x06, 0x049e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1895
		{ 0x06, 0x10e0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1896
		{ 0x06, 0x834e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1897
		{ 0x06, 0x7803 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1898
		{ 0x06, 0x9e0f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1899
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1900
		{ 0x06, 0x4e78 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1901
		{ 0x06, 0x019e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1902
		{ 0x06, 0x05ae },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1903
		{ 0x06, 0x0caf },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1904
		{ 0x06, 0x81f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1905
		{ 0x06, 0xaf81 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1906
		{ 0x06, 0xa3af },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1907
		{ 0x06, 0x81dc },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1908
		{ 0x06, 0xaf82 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1909
		{ 0x06, 0x13ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1910
		{ 0x06, 0x8348 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1911
		{ 0x06, 0x00ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1912
		{ 0x06, 0x8349 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1913
		{ 0x06, 0x00e0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1914
		{ 0x06, 0x8351 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1915
		{ 0x06, 0x10e4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1916
		{ 0x06, 0x8351 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1917
		{ 0x06, 0x5801 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1918
		{ 0x06, 0x9fea },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1919
		{ 0x06, 0xd000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1920
		{ 0x06, 0xd180 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1921
		{ 0x06, 0x1f66 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1922
		{ 0x06, 0xe2f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1923
		{ 0x06, 0xeae3 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1924
		{ 0x06, 0xf8eb },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1925
		{ 0x06, 0x5af8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1926
		{ 0x06, 0x1e20 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1927
		{ 0x06, 0xe6f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1928
		{ 0x06, 0xeae5 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1929
		{ 0x06, 0xf8eb },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1930
		{ 0x06, 0xd302 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1931
		{ 0x06, 0xb3fe },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1932
		{ 0x06, 0xe2f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1933
		{ 0x06, 0x7cef },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1934
		{ 0x06, 0x325b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1935
		{ 0x06, 0x80e3 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1936
		{ 0x06, 0xf87d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1937
		{ 0x06, 0x9e03 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1938
		{ 0x06, 0x7dff },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1939
		{ 0x06, 0xff0d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1940
		{ 0x06, 0x581c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1941
		{ 0x06, 0x551a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1942
		{ 0x06, 0x6511 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1943
		{ 0x06, 0xa190 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1944
		{ 0x06, 0xd3e2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1945
		{ 0x06, 0x8348 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1946
		{ 0x06, 0xe383 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1947
		{ 0x06, 0x491b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1948
		{ 0x06, 0x56ab },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1949
		{ 0x06, 0x08ef },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1950
		{ 0x06, 0x56e6 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1951
		{ 0x06, 0x8348 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1952
		{ 0x06, 0xe783 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1953
		{ 0x06, 0x4910 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1954
		{ 0x06, 0xd180 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1955
		{ 0x06, 0x1f66 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1956
		{ 0x06, 0xa004 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1957
		{ 0x06, 0xb9e2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1958
		{ 0x06, 0x8348 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1959
		{ 0x06, 0xe383 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1960
		{ 0x06, 0x49ef },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1961
		{ 0x06, 0x65e2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1962
		{ 0x06, 0x834a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1963
		{ 0x06, 0xe383 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1964
		{ 0x06, 0x4b1b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1965
		{ 0x06, 0x56aa },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1966
		{ 0x06, 0x0eef },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1967
		{ 0x06, 0x56e6 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1968
		{ 0x06, 0x834a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1969
		{ 0x06, 0xe783 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1970
		{ 0x06, 0x4be2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1971
		{ 0x06, 0x834d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1972
		{ 0x06, 0xe683 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1973
		{ 0x06, 0x4ce0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1974
		{ 0x06, 0x834d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1975
		{ 0x06, 0xa000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1976
		{ 0x06, 0x0caf },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1977
		{ 0x06, 0x81dc },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1978
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1979
		{ 0x06, 0x4d10 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1980
		{ 0x06, 0xe483 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1981
		{ 0x06, 0x4dae },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1982
		{ 0x06, 0x0480 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1983
		{ 0x06, 0xe483 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1984
		{ 0x06, 0x4de0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1985
		{ 0x06, 0x834e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1986
		{ 0x06, 0x7803 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1987
		{ 0x06, 0x9e0b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1988
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1989
		{ 0x06, 0x4e78 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1990
		{ 0x06, 0x049e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1991
		{ 0x06, 0x04ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1992
		{ 0x06, 0x834e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1993
		{ 0x06, 0x02e0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1994
		{ 0x06, 0x8332 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1995
		{ 0x06, 0xe183 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1996
		{ 0x06, 0x3359 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1997
		{ 0x06, 0x0fe2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1998
		{ 0x06, 0x834d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1999
		{ 0x06, 0x0c24 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2000
		{ 0x06, 0x5af0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2001
		{ 0x06, 0x1e12 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2002
		{ 0x06, 0xe4f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2003
		{ 0x06, 0x8ce5 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2004
		{ 0x06, 0xf88d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2005
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2006
		{ 0x06, 0x30e1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2007
		{ 0x06, 0x8331 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2008
		{ 0x06, 0x6801 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2009
		{ 0x06, 0xe4f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2010
		{ 0x06, 0x8ae5 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2011
		{ 0x06, 0xf88b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2012
		{ 0x06, 0xae37 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2013
		{ 0x06, 0xee83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2014
		{ 0x06, 0x4e03 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2015
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2016
		{ 0x06, 0x4ce1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2017
		{ 0x06, 0x834d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2018
		{ 0x06, 0x1b01 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2019
		{ 0x06, 0x9e04 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2020
		{ 0x06, 0xaaa1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2021
		{ 0x06, 0xaea8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2022
		{ 0x06, 0xee83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2023
		{ 0x06, 0x4e04 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2024
		{ 0x06, 0xee83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2025
		{ 0x06, 0x4f00 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2026
		{ 0x06, 0xaeab },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2027
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2028
		{ 0x06, 0x4f78 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2029
		{ 0x06, 0x039f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2030
		{ 0x06, 0x14ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2031
		{ 0x06, 0x834e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2032
		{ 0x06, 0x05d2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2033
		{ 0x06, 0x40d6 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2034
		{ 0x06, 0x5554 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2035
		{ 0x06, 0x0282 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2036
		{ 0x06, 0x17d2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2037
		{ 0x06, 0xa0d6 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2038
		{ 0x06, 0xba00 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2039
		{ 0x06, 0x0282 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2040
		{ 0x06, 0x17fe },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2041
		{ 0x06, 0xfdfc },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2042
		{ 0x06, 0x05f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2043
		{ 0x06, 0xe0f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2044
		{ 0x06, 0x60e1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2045
		{ 0x06, 0xf861 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2046
		{ 0x06, 0x6802 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2047
		{ 0x06, 0xe4f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2048
		{ 0x06, 0x60e5 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2049
		{ 0x06, 0xf861 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2050
		{ 0x06, 0xe0f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2051
		{ 0x06, 0x48e1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2052
		{ 0x06, 0xf849 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2053
		{ 0x06, 0x580f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2054
		{ 0x06, 0x1e02 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2055
		{ 0x06, 0xe4f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2056
		{ 0x06, 0x48e5 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2057
		{ 0x06, 0xf849 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2058
		{ 0x06, 0xd000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2059
		{ 0x06, 0x0282 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2060
		{ 0x06, 0x5bbf },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2061
		{ 0x06, 0x8350 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2062
		{ 0x06, 0xef46 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2063
		{ 0x06, 0xdc19 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2064
		{ 0x06, 0xddd0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2065
		{ 0x06, 0x0102 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2066
		{ 0x06, 0x825b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2067
		{ 0x06, 0x0282 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2068
		{ 0x06, 0x77e0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2069
		{ 0x06, 0xf860 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2070
		{ 0x06, 0xe1f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2071
		{ 0x06, 0x6158 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2072
		{ 0x06, 0xfde4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2073
		{ 0x06, 0xf860 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2074
		{ 0x06, 0xe5f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2075
		{ 0x06, 0x61fc },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2076
		{ 0x06, 0x04f9 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2077
		{ 0x06, 0xfafb },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2078
		{ 0x06, 0xc6bf },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2079
		{ 0x06, 0xf840 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2080
		{ 0x06, 0xbe83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2081
		{ 0x06, 0x50a0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2082
		{ 0x06, 0x0101 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2083
		{ 0x06, 0x071b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2084
		{ 0x06, 0x89cf },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2085
		{ 0x06, 0xd208 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2086
		{ 0x06, 0xebdb },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2087
		{ 0x06, 0x19b2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2088
		{ 0x06, 0xfbff },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2089
		{ 0x06, 0xfefd },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2090
		{ 0x06, 0x04f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2091
		{ 0x06, 0xe0f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2092
		{ 0x06, 0x48e1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2093
		{ 0x06, 0xf849 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2094
		{ 0x06, 0x6808 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2095
		{ 0x06, 0xe4f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2096
		{ 0x06, 0x48e5 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2097
		{ 0x06, 0xf849 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2098
		{ 0x06, 0x58f7 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2099
		{ 0x06, 0xe4f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2100
		{ 0x06, 0x48e5 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2101
		{ 0x06, 0xf849 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2102
		{ 0x06, 0xfc04 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2103
		{ 0x06, 0x4d20 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2104
		{ 0x06, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2105
		{ 0x06, 0x4e22 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2106
		{ 0x06, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2107
		{ 0x06, 0x4ddf },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2108
		{ 0x06, 0xff01 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2109
		{ 0x06, 0x4edd },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2110
		{ 0x06, 0xff01 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2111
		{ 0x05, 0x83d4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2112
		{ 0x06, 0x8000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2113
		{ 0x05, 0x83d8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2114
		{ 0x06, 0x8051 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2115
		{ 0x02, 0x6010 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2116
		{ 0x03, 0xdc00 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2117
		{ 0x05, 0xfff6 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2118
		{ 0x06, 0x00fc },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2119
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2120
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2121
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2122
		{ 0x0d, 0xf880 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2123
		{ 0x1f, 0x0000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2124
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2125
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2127
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2128
	mdio_write(ioaddr, 0x1f, 0x0002);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2129
	mdio_plus_minus(ioaddr, 0x0b, 0x0010, 0x00ef);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2130
	mdio_plus_minus(ioaddr, 0x0c, 0xa200, 0x5d00);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2131
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2133
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2134
	if (rtl8168d_efuse_read(ioaddr, 0x01) == 0xb1) {
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2136
			{ 0x1f, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2137
			{ 0x05, 0x669a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2138
			{ 0x1f, 0x0005 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2139
			{ 0x05, 0x8330 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2140
			{ 0x06, 0x669a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2141
			{ 0x1f, 0x0002 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2142
		};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2143
		int val;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2144
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2146
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2147
		val = mdio_read(ioaddr, 0x0d);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2148
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2149
		if ((val & 0x00ff) != 0x006c) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2150
			static const u32 set[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2151
				0x0065, 0x0066, 0x0067, 0x0068,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2152
				0x0069, 0x006a, 0x006b, 0x006c
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2153
			};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2154
			int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2155
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2156
			mdio_write(ioaddr, 0x1f, 0x0002);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2157
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2158
			val &= 0xff00;
4f6670f083f1 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++)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2160
				mdio_write(ioaddr, 0x0d, val | set[i]);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2161
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2162
	} else {
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2164
			{ 0x1f, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2165
			{ 0x05, 0x6662 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2166
			{ 0x1f, 0x0005 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2167
			{ 0x05, 0x8330 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2168
			{ 0x06, 0x6662 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2169
		};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2170
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2172
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2173
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2174
	mdio_write(ioaddr, 0x1f, 0x0002);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2175
	mdio_patch(ioaddr, 0x0d, 0x0300);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2176
	mdio_patch(ioaddr, 0x0f, 0x0010);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2177
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2178
	mdio_write(ioaddr, 0x1f, 0x0002);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2179
	mdio_plus_minus(ioaddr, 0x02, 0x0100, 0x0600);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2180
	mdio_plus_minus(ioaddr, 0x03, 0x0000, 0xe000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2181
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2183
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2184
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2186
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2188
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2189
		{ 0x06, 0x4064 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2190
		{ 0x07, 0x2863 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2191
		{ 0x08, 0x059c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2192
		{ 0x09, 0x26b4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2193
		{ 0x0a, 0x6a19 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2194
		{ 0x0b, 0xdcc8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2195
		{ 0x10, 0xf06d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2196
		{ 0x14, 0x7f68 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2197
		{ 0x18, 0x7fd9 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2198
		{ 0x1c, 0xf0ff },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2199
		{ 0x1d, 0x3d9c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2200
		{ 0x1f, 0x0003 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2201
		{ 0x12, 0xf49f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2202
		{ 0x13, 0x070b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2203
		{ 0x1a, 0x05ad },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2204
		{ 0x14, 0x94c0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2205
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2206
		{ 0x1f, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2207
		{ 0x06, 0x5561 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2208
		{ 0x1f, 0x0005 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2209
		{ 0x05, 0x8332 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2210
		{ 0x06, 0x5561 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2211
	};
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2213
		{ 0x1f, 0x0005 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2214
		{ 0x05, 0xffc2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2215
		{ 0x1f, 0x0005 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2216
		{ 0x05, 0x8000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2217
		{ 0x06, 0xf8f9 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2218
		{ 0x06, 0xfaee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2219
		{ 0x06, 0xf8ea },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2220
		{ 0x06, 0x00ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2221
		{ 0x06, 0xf8eb },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2222
		{ 0x06, 0x00e2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2223
		{ 0x06, 0xf87c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2224
		{ 0x06, 0xe3f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2225
		{ 0x06, 0x7da5 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2226
		{ 0x06, 0x1111 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2227
		{ 0x06, 0x12d2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2228
		{ 0x06, 0x40d6 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2229
		{ 0x06, 0x4444 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2230
		{ 0x06, 0x0281 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2231
		{ 0x06, 0xc6d2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2232
		{ 0x06, 0xa0d6 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2233
		{ 0x06, 0xaaaa },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2234
		{ 0x06, 0x0281 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2235
		{ 0x06, 0xc6ae },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2236
		{ 0x06, 0x0fa5 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2237
		{ 0x06, 0x4444 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2238
		{ 0x06, 0x02ae },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2239
		{ 0x06, 0x4da5 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2240
		{ 0x06, 0xaaaa },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2241
		{ 0x06, 0x02ae },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2242
		{ 0x06, 0x47af },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2243
		{ 0x06, 0x81c2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2244
		{ 0x06, 0xee83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2245
		{ 0x06, 0x4e00 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2246
		{ 0x06, 0xee83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2247
		{ 0x06, 0x4d0f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2248
		{ 0x06, 0xee83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2249
		{ 0x06, 0x4c0f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2250
		{ 0x06, 0xee83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2251
		{ 0x06, 0x4f00 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2252
		{ 0x06, 0xee83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2253
		{ 0x06, 0x5100 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2254
		{ 0x06, 0xee83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2255
		{ 0x06, 0x4aff },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2256
		{ 0x06, 0xee83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2257
		{ 0x06, 0x4bff },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2258
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2259
		{ 0x06, 0x30e1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2260
		{ 0x06, 0x8331 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2261
		{ 0x06, 0x58fe },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2262
		{ 0x06, 0xe4f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2263
		{ 0x06, 0x8ae5 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2264
		{ 0x06, 0xf88b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2265
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2266
		{ 0x06, 0x32e1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2267
		{ 0x06, 0x8333 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2268
		{ 0x06, 0x590f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2269
		{ 0x06, 0xe283 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2270
		{ 0x06, 0x4d0c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2271
		{ 0x06, 0x245a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2272
		{ 0x06, 0xf01e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2273
		{ 0x06, 0x12e4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2274
		{ 0x06, 0xf88c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2275
		{ 0x06, 0xe5f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2276
		{ 0x06, 0x8daf },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2277
		{ 0x06, 0x81c2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2278
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2279
		{ 0x06, 0x4f10 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2280
		{ 0x06, 0xe483 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2281
		{ 0x06, 0x4fe0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2282
		{ 0x06, 0x834e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2283
		{ 0x06, 0x7800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2284
		{ 0x06, 0x9f0a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2285
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2286
		{ 0x06, 0x4fa0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2287
		{ 0x06, 0x10a5 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2288
		{ 0x06, 0xee83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2289
		{ 0x06, 0x4e01 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2290
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2291
		{ 0x06, 0x4e78 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2292
		{ 0x06, 0x059e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2293
		{ 0x06, 0x9ae0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2294
		{ 0x06, 0x834e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2295
		{ 0x06, 0x7804 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2296
		{ 0x06, 0x9e10 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2297
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2298
		{ 0x06, 0x4e78 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2299
		{ 0x06, 0x039e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2300
		{ 0x06, 0x0fe0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2301
		{ 0x06, 0x834e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2302
		{ 0x06, 0x7801 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2303
		{ 0x06, 0x9e05 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2304
		{ 0x06, 0xae0c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2305
		{ 0x06, 0xaf81 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2306
		{ 0x06, 0xa7af },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2307
		{ 0x06, 0x8152 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2308
		{ 0x06, 0xaf81 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2309
		{ 0x06, 0x8baf },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2310
		{ 0x06, 0x81c2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2311
		{ 0x06, 0xee83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2312
		{ 0x06, 0x4800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2313
		{ 0x06, 0xee83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2314
		{ 0x06, 0x4900 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2315
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2316
		{ 0x06, 0x5110 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2317
		{ 0x06, 0xe483 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2318
		{ 0x06, 0x5158 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2319
		{ 0x06, 0x019f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2320
		{ 0x06, 0xead0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2321
		{ 0x06, 0x00d1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2322
		{ 0x06, 0x801f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2323
		{ 0x06, 0x66e2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2324
		{ 0x06, 0xf8ea },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2325
		{ 0x06, 0xe3f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2326
		{ 0x06, 0xeb5a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2327
		{ 0x06, 0xf81e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2328
		{ 0x06, 0x20e6 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2329
		{ 0x06, 0xf8ea },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2330
		{ 0x06, 0xe5f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2331
		{ 0x06, 0xebd3 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2332
		{ 0x06, 0x02b3 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2333
		{ 0x06, 0xfee2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2334
		{ 0x06, 0xf87c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2335
		{ 0x06, 0xef32 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2336
		{ 0x06, 0x5b80 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2337
		{ 0x06, 0xe3f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2338
		{ 0x06, 0x7d9e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2339
		{ 0x06, 0x037d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2340
		{ 0x06, 0xffff },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2341
		{ 0x06, 0x0d58 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2342
		{ 0x06, 0x1c55 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2343
		{ 0x06, 0x1a65 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2344
		{ 0x06, 0x11a1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2345
		{ 0x06, 0x90d3 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2346
		{ 0x06, 0xe283 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2347
		{ 0x06, 0x48e3 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2348
		{ 0x06, 0x8349 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2349
		{ 0x06, 0x1b56 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2350
		{ 0x06, 0xab08 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2351
		{ 0x06, 0xef56 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2352
		{ 0x06, 0xe683 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2353
		{ 0x06, 0x48e7 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2354
		{ 0x06, 0x8349 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2355
		{ 0x06, 0x10d1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2356
		{ 0x06, 0x801f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2357
		{ 0x06, 0x66a0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2358
		{ 0x06, 0x04b9 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2359
		{ 0x06, 0xe283 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2360
		{ 0x06, 0x48e3 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2361
		{ 0x06, 0x8349 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2362
		{ 0x06, 0xef65 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2363
		{ 0x06, 0xe283 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2364
		{ 0x06, 0x4ae3 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2365
		{ 0x06, 0x834b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2366
		{ 0x06, 0x1b56 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2367
		{ 0x06, 0xaa0e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2368
		{ 0x06, 0xef56 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2369
		{ 0x06, 0xe683 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2370
		{ 0x06, 0x4ae7 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2371
		{ 0x06, 0x834b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2372
		{ 0x06, 0xe283 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2373
		{ 0x06, 0x4de6 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2374
		{ 0x06, 0x834c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2375
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2376
		{ 0x06, 0x4da0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2377
		{ 0x06, 0x000c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2378
		{ 0x06, 0xaf81 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2379
		{ 0x06, 0x8be0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2380
		{ 0x06, 0x834d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2381
		{ 0x06, 0x10e4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2382
		{ 0x06, 0x834d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2383
		{ 0x06, 0xae04 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2384
		{ 0x06, 0x80e4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2385
		{ 0x06, 0x834d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2386
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2387
		{ 0x06, 0x4e78 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2388
		{ 0x06, 0x039e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2389
		{ 0x06, 0x0be0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2390
		{ 0x06, 0x834e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2391
		{ 0x06, 0x7804 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2392
		{ 0x06, 0x9e04 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2393
		{ 0x06, 0xee83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2394
		{ 0x06, 0x4e02 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2395
		{ 0x06, 0xe083 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2396
		{ 0x06, 0x32e1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2397
		{ 0x06, 0x8333 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2398
		{ 0x06, 0x590f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2399
		{ 0x06, 0xe283 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2400
		{ 0x06, 0x4d0c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2401
		{ 0x06, 0x245a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2402
		{ 0x06, 0xf01e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2403
		{ 0x06, 0x12e4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2404
		{ 0x06, 0xf88c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2405
		{ 0x06, 0xe5f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2406
		{ 0x06, 0x8de0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2407
		{ 0x06, 0x8330 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2408
		{ 0x06, 0xe183 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2409
		{ 0x06, 0x3168 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2410
		{ 0x06, 0x01e4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2411
		{ 0x06, 0xf88a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2412
		{ 0x06, 0xe5f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2413
		{ 0x06, 0x8bae },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2414
		{ 0x06, 0x37ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2415
		{ 0x06, 0x834e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2416
		{ 0x06, 0x03e0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2417
		{ 0x06, 0x834c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2418
		{ 0x06, 0xe183 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2419
		{ 0x06, 0x4d1b },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2420
		{ 0x06, 0x019e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2421
		{ 0x06, 0x04aa },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2422
		{ 0x06, 0xa1ae },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2423
		{ 0x06, 0xa8ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2424
		{ 0x06, 0x834e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2425
		{ 0x06, 0x04ee },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2426
		{ 0x06, 0x834f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2427
		{ 0x06, 0x00ae },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2428
		{ 0x06, 0xabe0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2429
		{ 0x06, 0x834f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2430
		{ 0x06, 0x7803 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2431
		{ 0x06, 0x9f14 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2432
		{ 0x06, 0xee83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2433
		{ 0x06, 0x4e05 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2434
		{ 0x06, 0xd240 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2435
		{ 0x06, 0xd655 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2436
		{ 0x06, 0x5402 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2437
		{ 0x06, 0x81c6 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2438
		{ 0x06, 0xd2a0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2439
		{ 0x06, 0xd6ba },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2440
		{ 0x06, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2441
		{ 0x06, 0x81c6 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2442
		{ 0x06, 0xfefd },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2443
		{ 0x06, 0xfc05 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2444
		{ 0x06, 0xf8e0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2445
		{ 0x06, 0xf860 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2446
		{ 0x06, 0xe1f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2447
		{ 0x06, 0x6168 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2448
		{ 0x06, 0x02e4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2449
		{ 0x06, 0xf860 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2450
		{ 0x06, 0xe5f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2451
		{ 0x06, 0x61e0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2452
		{ 0x06, 0xf848 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2453
		{ 0x06, 0xe1f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2454
		{ 0x06, 0x4958 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2455
		{ 0x06, 0x0f1e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2456
		{ 0x06, 0x02e4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2457
		{ 0x06, 0xf848 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2458
		{ 0x06, 0xe5f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2459
		{ 0x06, 0x49d0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2460
		{ 0x06, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2461
		{ 0x06, 0x820a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2462
		{ 0x06, 0xbf83 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2463
		{ 0x06, 0x50ef },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2464
		{ 0x06, 0x46dc },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2465
		{ 0x06, 0x19dd },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2466
		{ 0x06, 0xd001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2467
		{ 0x06, 0x0282 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2468
		{ 0x06, 0x0a02 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2469
		{ 0x06, 0x8226 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2470
		{ 0x06, 0xe0f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2471
		{ 0x06, 0x60e1 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2472
		{ 0x06, 0xf861 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2473
		{ 0x06, 0x58fd },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2474
		{ 0x06, 0xe4f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2475
		{ 0x06, 0x60e5 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2476
		{ 0x06, 0xf861 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2477
		{ 0x06, 0xfc04 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2478
		{ 0x06, 0xf9fa },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2479
		{ 0x06, 0xfbc6 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2480
		{ 0x06, 0xbff8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2481
		{ 0x06, 0x40be },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2482
		{ 0x06, 0x8350 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2483
		{ 0x06, 0xa001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2484
		{ 0x06, 0x0107 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2485
		{ 0x06, 0x1b89 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2486
		{ 0x06, 0xcfd2 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2487
		{ 0x06, 0x08eb },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2488
		{ 0x06, 0xdb19 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2489
		{ 0x06, 0xb2fb },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2490
		{ 0x06, 0xfffe },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2491
		{ 0x06, 0xfd04 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2492
		{ 0x06, 0xf8e0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2493
		{ 0x06, 0xf848 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2494
		{ 0x06, 0xe1f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2495
		{ 0x06, 0x4968 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2496
		{ 0x06, 0x08e4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2497
		{ 0x06, 0xf848 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2498
		{ 0x06, 0xe5f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2499
		{ 0x06, 0x4958 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2500
		{ 0x06, 0xf7e4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2501
		{ 0x06, 0xf848 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2502
		{ 0x06, 0xe5f8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2503
		{ 0x06, 0x49fc },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2504
		{ 0x06, 0x044d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2505
		{ 0x06, 0x2000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2506
		{ 0x06, 0x024e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2507
		{ 0x06, 0x2200 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2508
		{ 0x06, 0x024d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2509
		{ 0x06, 0xdfff },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2510
		{ 0x06, 0x014e },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2511
		{ 0x06, 0xddff },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2512
		{ 0x06, 0x0100 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2513
		{ 0x05, 0x83d8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2514
		{ 0x06, 0x8000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2515
		{ 0x03, 0xdc00 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2516
		{ 0x05, 0xfff6 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2517
		{ 0x06, 0x00fc },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2518
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2519
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2520
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2521
		{ 0x0d, 0xf880 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2522
		{ 0x1f, 0x0000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2523
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2524
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2525
	rtl_phy_write(ioaddr, phy_reg_init_0, ARRAY_SIZE(phy_reg_init_0));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2526
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2527
	if (rtl8168d_efuse_read(ioaddr, 0x01) == 0xb1) {
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2529
			{ 0x1f, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2530
			{ 0x05, 0x669a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2531
			{ 0x1f, 0x0005 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2532
			{ 0x05, 0x8330 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2533
			{ 0x06, 0x669a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2534
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2535
			{ 0x1f, 0x0002 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2536
		};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2537
		int val;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2538
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2539
		rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2540
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2541
		val = mdio_read(ioaddr, 0x0d);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2542
		if ((val & 0x00ff) != 0x006c) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2543
			u32 set[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2544
				0x0065, 0x0066, 0x0067, 0x0068,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2545
				0x0069, 0x006a, 0x006b, 0x006c
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2546
			};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2547
			int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2548
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2549
			mdio_write(ioaddr, 0x1f, 0x0002);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2550
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2551
			val &= 0xff00;
4f6670f083f1 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++)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2553
				mdio_write(ioaddr, 0x0d, val | set[i]);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2554
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2555
	} else {
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2557
			{ 0x1f, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2558
			{ 0x05, 0x2642 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2559
			{ 0x1f, 0x0005 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2560
			{ 0x05, 0x8330 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2561
			{ 0x06, 0x2642 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2562
		};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2563
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2565
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2566
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2567
	mdio_write(ioaddr, 0x1f, 0x0002);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2568
	mdio_plus_minus(ioaddr, 0x02, 0x0100, 0x0600);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2569
	mdio_plus_minus(ioaddr, 0x03, 0x0000, 0xe000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2570
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2571
	mdio_write(ioaddr, 0x1f, 0x0001);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2572
	mdio_write(ioaddr, 0x17, 0x0cc0);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2573
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2574
	mdio_write(ioaddr, 0x1f, 0x0002);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2575
	mdio_patch(ioaddr, 0x0f, 0x0017);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2576
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2578
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2579
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2581
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2583
		{ 0x1f, 0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2584
		{ 0x10, 0x0008 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2585
		{ 0x0d, 0x006c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2586
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2587
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2588
		{ 0x0d, 0xf880 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2589
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2590
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2591
		{ 0x17, 0x0cc0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2592
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2593
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2594
		{ 0x0b, 0xa4d8 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2595
		{ 0x09, 0x281c },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2596
		{ 0x07, 0x2883 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2597
		{ 0x0a, 0x6b35 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2598
		{ 0x1d, 0x3da4 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2599
		{ 0x1c, 0xeffd },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2600
		{ 0x14, 0x7f52 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2601
		{ 0x18, 0x7fc6 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2602
		{ 0x08, 0x0601 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2603
		{ 0x06, 0x4063 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2604
		{ 0x10, 0xf074 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2605
		{ 0x1f, 0x0003 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2606
		{ 0x13, 0x0789 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2607
		{ 0x12, 0xf4bd },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2608
		{ 0x1a, 0x04fd },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2609
		{ 0x14, 0x84b0 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2610
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2611
		{ 0x00, 0x9200 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2612
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2613
		{ 0x1f, 0x0005 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2614
		{ 0x01, 0x0340 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2615
		{ 0x1f, 0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2616
		{ 0x04, 0x4000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2617
		{ 0x03, 0x1d21 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2618
		{ 0x02, 0x0c32 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2619
		{ 0x01, 0x0200 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2620
		{ 0x00, 0x5554 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2621
		{ 0x04, 0x4800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2622
		{ 0x04, 0x4000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2623
		{ 0x04, 0xf000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2624
		{ 0x03, 0xdf01 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2625
		{ 0x02, 0xdf20 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2626
		{ 0x01, 0x101a },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2627
		{ 0x00, 0xa0ff },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2628
		{ 0x04, 0xf800 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2629
		{ 0x04, 0xf000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2630
		{ 0x1f, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2631
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2632
		{ 0x1f, 0x0007 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2633
		{ 0x1e, 0x0023 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2634
		{ 0x16, 0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2635
		{ 0x1f, 0x0000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2636
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2637
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2638
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2639
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2640
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2642
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2643
	static const struct phy_reg phy_reg_init[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2644
		{ 0x1f, 0x0003 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2645
		{ 0x08, 0x441d },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2646
		{ 0x01, 0x9100 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2647
		{ 0x1f, 0x0000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2648
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2649
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2650
	mdio_write(ioaddr, 0x1f, 0x0000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2651
	mdio_patch(ioaddr, 0x11, 1 << 12);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2652
	mdio_patch(ioaddr, 0x19, 1 << 13);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2653
	mdio_patch(ioaddr, 0x10, 1 << 15);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2654
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2656
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2657
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2659
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2660
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2661
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2662
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2663
	rtl8169_print_mac_version(tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2664
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2665
	switch (tp->mac_version) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2666
	case RTL_GIGA_MAC_VER_01:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2667
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2668
	case RTL_GIGA_MAC_VER_02:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2669
	case RTL_GIGA_MAC_VER_03:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2670
		rtl8169s_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2671
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2672
	case RTL_GIGA_MAC_VER_04:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2673
		rtl8169sb_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2674
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2675
	case RTL_GIGA_MAC_VER_05:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2676
		rtl8169scd_hw_phy_config(tp, ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2677
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2678
	case RTL_GIGA_MAC_VER_06:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2679
		rtl8169sce_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2680
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2681
	case RTL_GIGA_MAC_VER_07:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2682
	case RTL_GIGA_MAC_VER_08:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2683
	case RTL_GIGA_MAC_VER_09:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2684
		rtl8102e_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2685
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2686
	case RTL_GIGA_MAC_VER_11:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2687
		rtl8168bb_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2688
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2689
	case RTL_GIGA_MAC_VER_12:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2690
		rtl8168bef_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2691
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2692
	case RTL_GIGA_MAC_VER_17:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2693
		rtl8168bef_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2694
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2695
	case RTL_GIGA_MAC_VER_18:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2696
		rtl8168cp_1_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2697
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2698
	case RTL_GIGA_MAC_VER_19:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2699
		rtl8168c_1_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2700
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2701
	case RTL_GIGA_MAC_VER_20:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2702
		rtl8168c_2_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2703
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2704
	case RTL_GIGA_MAC_VER_21:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2705
		rtl8168c_3_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2706
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2707
	case RTL_GIGA_MAC_VER_22:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2708
		rtl8168c_4_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2709
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2710
	case RTL_GIGA_MAC_VER_23:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2711
	case RTL_GIGA_MAC_VER_24:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2712
		rtl8168cp_2_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2713
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2714
	case RTL_GIGA_MAC_VER_25:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2715
		rtl8168d_1_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2716
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2717
	case RTL_GIGA_MAC_VER_26:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2718
		rtl8168d_2_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2719
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2720
	case RTL_GIGA_MAC_VER_27:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2721
		rtl8168d_3_hw_phy_config(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2722
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2723
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2724
	default:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2725
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2726
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2727
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2728
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2730
{
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2732
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2733
	struct timer_list *timer = &tp->timer;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2734
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2735
	unsigned long timeout = RTL8169_PHY_TIMEOUT;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2736
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2737
	assert(tp->mac_version > RTL_GIGA_MAC_VER_01);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2738
4f6670f083f1 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))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2740
		return;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2741
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2742
	if (!tp->ecdev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2743
		spin_lock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2744
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2745
	if (tp->phy_reset_pending(ioaddr)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2746
		/*
4f6670f083f1 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.
4f6670f083f1 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.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2749
		 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2750
		timeout = HZ/10;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2751
		goto out_mod_timer;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2752
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2753
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2754
	if (tp->link_ok(ioaddr))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2755
		goto out_unlock;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2756
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2758
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2759
	tp->phy_reset_enable(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2760
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2761
out_mod_timer:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2762
	if (!tp->ecdev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2763
		mod_timer(timer, jiffies + timeout);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2764
out_unlock:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2765
	if (!tp->ecdev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2766
		spin_unlock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2767
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2768
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2770
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2771
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2772
	struct timer_list *timer = &tp->timer;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2773
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2775
		return;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2776
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2777
	del_timer_sync(timer);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2778
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2779
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2781
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2782
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2783
	struct timer_list *timer = &tp->timer;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2784
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2786
		return;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2787
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2788
	mod_timer(timer, jiffies + RTL8169_PHY_TIMEOUT);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2789
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2790
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2791
#ifdef CONFIG_NET_POLL_CONTROLLER
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2792
/*
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2793
 * Polling 'interrupt' - used by things like netconsole to send skbs
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2794
 * without having to re-enable interrupts. It's not called while
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2795
 * the interrupt routine is executing.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2796
 */
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2798
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2799
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2800
	struct pci_dev *pdev = tp->pci_dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2801
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2802
	disable_irq(pdev->irq);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2803
	rtl8169_interrupt(pdev->irq, dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2804
	enable_irq(pdev->irq);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2805
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2806
#endif
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2807
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2809
				  void __iomem *ioaddr)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2810
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2811
	iounmap(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2812
	pci_release_regions(pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2813
	pci_clear_mwi(pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2814
	pci_disable_device(pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2815
	free_netdev(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2816
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2817
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2818
static void rtl8169_phy_reset(struct net_device *dev,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2819
			      struct rtl8169_private *tp)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2820
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2821
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2822
	unsigned int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2823
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2824
	tp->phy_reset_enable(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2825
	for (i = 0; i < 100; i++) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2826
		if (!tp->phy_reset_pending(ioaddr))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2827
			return;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2828
		msleep(1);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2829
	}
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2831
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2832
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2834
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2835
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2836
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2837
	rtl_hw_phy_config(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2838
4f6670f083f1 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) {
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2841
		RTL_W8(0x82, 0x01);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2842
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2843
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2844
	pci_write_config_byte(tp->pci_dev, PCI_LATENCY_TIMER, 0x40);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2845
4f6670f083f1 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)
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2848
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2849
	if (tp->mac_version == RTL_GIGA_MAC_VER_02) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2850
		dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2851
		RTL_W8(0x82, 0x01);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2852
		dprintk("Set PHY Reg 0x0bh = 0x00h\n");
4f6670f083f1 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
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2854
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2855
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2856
	rtl8169_phy_reset(dev, tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2857
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2858
	/*
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2859
	 * rtl8169_set_speed_xmii takes good care of the Fast Ethernet
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2860
	 * only 8101. Don't panic.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2861
	 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2862
	rtl8169_set_speed(dev, AUTONEG_ENABLE, SPEED_1000, DUPLEX_FULL);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2863
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2864
	if (RTL_R8(PHYstatus) & TBI_Enable)
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2866
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2867
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2869
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2870
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2871
	u32 high;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2872
	u32 low;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2873
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2874
	low  = addr[0] | (addr[1] << 8) | (addr[2] << 16) | (addr[3] << 24);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2875
	high = addr[4] | (addr[5] << 8);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2876
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2877
	spin_lock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2878
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2879
	RTL_W8(Cfg9346, Cfg9346_Unlock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2880
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2881
	RTL_W32(MAC4, high);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2882
	RTL_R32(MAC4);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2883
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2884
	RTL_W32(MAC0, low);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2885
	RTL_R32(MAC0);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2886
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2887
	RTL_W8(Cfg9346, Cfg9346_Lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2888
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2889
	spin_unlock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2890
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2891
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2892
static int rtl_set_mac_address(struct net_device *dev, void *p)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2893
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2894
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2895
	struct sockaddr *addr = p;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2896
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2897
	if (!is_valid_ether_addr(addr->sa_data))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2898
		return -EADDRNOTAVAIL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2899
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2900
	memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2901
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2902
	rtl_rar_set(tp, dev->dev_addr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2903
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2904
	return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2905
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2906
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2907
static int rtl8169_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2908
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2909
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2911
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2913
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2914
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2915
static int rtl_xmii_ioctl(struct rtl8169_private *tp, struct mii_ioctl_data *data, int cmd)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2916
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2917
	switch (cmd) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2918
	case SIOCGMIIPHY:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2919
		data->phy_id = 32; /* Internal PHY */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2920
		return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2921
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2922
	case SIOCGMIIREG:
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2924
		return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2925
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2926
	case SIOCSMIIREG:
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2928
		return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2929
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2930
	return -EOPNOTSUPP;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2931
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2932
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2934
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2935
	return -EOPNOTSUPP;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2936
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2937
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2938
static const struct rtl_cfg_info {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2939
	void (*hw_start)(struct net_device *);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2940
	unsigned int region;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2941
	unsigned int align;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2942
	u16 intr_event;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2943
	u16 napi_event;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2944
	unsigned features;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2945
	u8 default_ver;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2946
} rtl_cfg_infos [] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2947
	[RTL_CFG_0] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2948
		.hw_start	= rtl_hw_start_8169,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2949
		.region		= 1,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2950
		.align		= 0,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2951
		.intr_event	= SYSErr | LinkChg | RxOverflow |
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2952
				  RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2953
		.napi_event	= RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2954
		.features	= RTL_FEATURE_GMII,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2955
		.default_ver	= RTL_GIGA_MAC_VER_01,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2956
	},
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2957
	[RTL_CFG_1] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2958
		.hw_start	= rtl_hw_start_8168,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2959
		.region		= 2,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2960
		.align		= 8,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2961
		.intr_event	= SYSErr | LinkChg | RxOverflow |
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2962
				  TxErr | TxOK | RxOK | RxErr,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2963
		.napi_event	= TxErr | TxOK | RxOK | RxOverflow,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2964
		.features	= RTL_FEATURE_GMII | RTL_FEATURE_MSI,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2965
		.default_ver	= RTL_GIGA_MAC_VER_11,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2966
	},
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2967
	[RTL_CFG_2] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2968
		.hw_start	= rtl_hw_start_8101,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2969
		.region		= 2,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2970
		.align		= 8,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2971
		.intr_event	= SYSErr | LinkChg | RxOverflow | PCSTimeout |
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2972
				  RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2973
		.napi_event	= RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2974
		.features	= RTL_FEATURE_MSI,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2975
		.default_ver	= RTL_GIGA_MAC_VER_13,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2976
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2977
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2978
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2979
/* Cfg9346_Unlock assumed. */
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2981
			    const struct rtl_cfg_info *cfg)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2982
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2983
	unsigned msi = 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2984
	u8 cfg2;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2985
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2986
	cfg2 = RTL_R8(Config2) & ~MSIEnable;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2987
	if (cfg->features & RTL_FEATURE_MSI) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2988
		if (pci_enable_msi(pdev)) {
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2990
		} else {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2991
			cfg2 |= MSIEnable;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2992
			msi = RTL_FEATURE_MSI;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2993
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2994
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2995
	RTL_W8(Config2, cfg2);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2996
	return msi;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2997
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2998
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3000
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3001
	if (tp->features & RTL_FEATURE_MSI) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3002
		pci_disable_msi(pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3003
		tp->features &= ~RTL_FEATURE_MSI;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3004
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3005
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3006
4f6670f083f1 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 = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3008
	.ndo_open		= rtl8169_open,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3009
	.ndo_stop		= rtl8169_close,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3010
	.ndo_get_stats		= rtl8169_get_stats,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3011
	.ndo_start_xmit		= rtl8169_start_xmit,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3012
	.ndo_tx_timeout		= rtl8169_tx_timeout,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3013
	.ndo_validate_addr	= eth_validate_addr,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3014
	.ndo_change_mtu		= rtl8169_change_mtu,
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3016
	.ndo_do_ioctl		= rtl8169_ioctl,
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3018
#ifdef CONFIG_R8169_VLAN
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3020
#endif
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3021
#ifdef CONFIG_NET_POLL_CONTROLLER
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3022
	.ndo_poll_controller	= rtl8169_netpoll,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3023
#endif
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3024
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3025
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3026
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3027
static int __devinit
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3029
{
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3031
	const unsigned int region = cfg->region;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3032
	struct rtl8169_private *tp;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3033
	struct mii_if_info *mii;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3034
	struct net_device *dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3035
	void __iomem *ioaddr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3036
	unsigned int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3037
	int rc;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3038
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3039
	if (netif_msg_drv(&debug)) {
4f6670f083f1 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",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3041
		       MODULENAME, RTL8169_VERSION);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3042
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3043
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3044
	dev = alloc_etherdev(sizeof (*tp));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3045
	if (!dev) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3046
		if (netif_msg_drv(&debug))
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3048
		rc = -ENOMEM;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3049
		goto out;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3050
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3051
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3052
	SET_NETDEV_DEV(dev, &pdev->dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3053
	dev->netdev_ops = &rtl8169_netdev_ops;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3054
	tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3055
	tp->dev = dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3056
	tp->pci_dev = pdev;
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3058
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3059
	mii = &tp->mii;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3060
	mii->dev = dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3061
	mii->mdio_read = rtl_mdio_read;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3062
	mii->mdio_write = rtl_mdio_write;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3063
	mii->phy_id_mask = 0x1f;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3064
	mii->reg_num_mask = 0x1f;
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3066
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3067
	/* disable ASPM completely as that cause random device stop working
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3068
	 * problems as well as full system hangs for some PCIe devices users */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3069
	pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 |
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3070
				     PCIE_LINK_STATE_CLKPM);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3071
4f6670f083f1 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) */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3073
	rc = pci_enable_device(pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3074
	if (rc < 0) {
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3076
		goto err_out_free_dev_1;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3077
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3078
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3079
	if (pci_set_mwi(pdev) < 0)
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3081
4f6670f083f1 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 */
4f6670f083f1 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)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3084
		netif_err(tp, probe, dev,
4f6670f083f1 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",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3086
			  region);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3087
		rc = -ENODEV;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3088
		goto err_out_mwi_2;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3089
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3090
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3091
	/* check for weird/broken PCI region reporting */
4f6670f083f1 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) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3093
		netif_err(tp, probe, dev,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3094
			  "Invalid PCI region size(s), aborting\n");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3095
		rc = -ENODEV;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3096
		goto err_out_mwi_2;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3097
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3098
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3099
	rc = pci_request_regions(pdev, MODULENAME);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3100
	if (rc < 0) {
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3102
		goto err_out_mwi_2;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3103
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3104
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3105
	tp->cp_cmd = PCIMulRW | RxChkSum;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3106
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3107
	if ((sizeof(dma_addr_t) > 4) &&
4f6670f083f1 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) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3109
		tp->cp_cmd |= PCIDAC;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3110
		dev->features |= NETIF_F_HIGHDMA;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3111
	} else {
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3113
		if (rc < 0) {
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3115
			goto err_out_free_res_3;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3116
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3117
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3118
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3119
	/* ioremap MMIO region */
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3121
	if (!ioaddr) {
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3123
		rc = -EIO;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3124
		goto err_out_free_res_3;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3125
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3126
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3127
	tp->pcie_cap = pci_find_capability(pdev, PCI_CAP_ID_EXP);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3128
	if (!tp->pcie_cap)
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3130
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3131
	RTL_W16(IntrMask, 0x0000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3132
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3133
	/* Soft reset the chip. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3134
	RTL_W8(ChipCmd, CmdReset);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3135
4f6670f083f1 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. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3137
	for (i = 0; i < 100; i++) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3138
		if ((RTL_R8(ChipCmd) & CmdReset) == 0)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3139
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3140
		msleep_interruptible(1);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3141
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3142
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3143
	RTL_W16(IntrStatus, 0xffff);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3144
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3145
	pci_set_master(pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3146
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3147
	/* Identify chip attached to board */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3148
	rtl8169_get_mac_version(tp, ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3149
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3150
	/* Use appropriate default if unknown */
4f6670f083f1 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) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3152
		netif_notice(tp, probe, dev,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3153
			     "unknown MAC, using family default\n");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3154
		tp->mac_version = cfg->default_ver;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3155
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3156
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3157
	rtl8169_print_mac_version(tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3158
4f6670f083f1 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++) {
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3161
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3162
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3163
	if (i == ARRAY_SIZE(rtl_chip_info)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3164
		dev_err(&pdev->dev,
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3166
		goto err_out_msi_4;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3167
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3168
	tp->chipset = i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3169
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3170
	RTL_W8(Cfg9346, Cfg9346_Unlock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3171
	RTL_W8(Config1, RTL_R8(Config1) | PMEnable);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3172
	RTL_W8(Config5, RTL_R8(Config5) & PMEStatus);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3173
	if ((RTL_R8(Config3) & (LinkUp | MagicPacket)) != 0)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3174
		tp->features |= RTL_FEATURE_WOL;
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3176
		tp->features |= RTL_FEATURE_WOL;
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3178
	RTL_W8(Cfg9346, Cfg9346_Lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3179
4f6670f083f1 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) &&
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3181
	    (RTL_R8(PHYstatus) & TBI_Enable)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3182
		tp->set_speed = rtl8169_set_speed_tbi;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3183
		tp->get_settings = rtl8169_gset_tbi;
4f6670f083f1 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;
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3186
		tp->link_ok = rtl8169_tbi_link_ok;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3187
		tp->do_ioctl = rtl_tbi_ioctl;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3188
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3190
	} else {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3191
		tp->set_speed = rtl8169_set_speed_xmii;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3192
		tp->get_settings = rtl8169_gset_xmii;
4f6670f083f1 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;
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3195
		tp->link_ok = rtl8169_xmii_link_ok;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3196
		tp->do_ioctl = rtl_xmii_ioctl;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3197
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3198
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3199
	spin_lock_init(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3200
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3201
	tp->mmio_addr = ioaddr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3202
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3203
	/* Get MAC address */
4f6670f083f1 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++)
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3207
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3208
	SET_ETHTOOL_OPS(dev, &rtl8169_ethtool_ops);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3209
	dev->watchdog_timeo = RTL8169_TX_TIMEOUT;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3210
	dev->irq = pdev->irq;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3211
	dev->base_addr = (unsigned long) ioaddr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3212
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3214
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3215
#ifdef CONFIG_R8169_VLAN
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3217
#endif
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3218
	dev->features |= NETIF_F_GRO;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3219
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3220
	tp->intr_mask = 0xffff;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3221
	tp->hw_start = cfg->hw_start;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3222
	tp->intr_event = cfg->intr_event;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3223
	tp->napi_event = cfg->napi_event;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3224
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3225
	init_timer(&tp->timer);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3226
	tp->timer.data = (unsigned long) dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3227
	tp->timer.function = rtl8169_phy_timer;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3228
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3229
	// offer device to EtherCAT master module
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3231
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3232
	if (!tp->ecdev) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3233
		rc = register_netdev(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3234
		if (rc < 0)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3235
			goto err_out_msi_4;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3236
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3237
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3238
	pci_set_drvdata(pdev, dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3239
4f6670f083f1 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",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3241
		   rtl_chip_info[tp->chipset].name,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3242
		   dev->base_addr, dev->dev_addr,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3243
		   (u32)(RTL_R32(TxConfig) & 0x9cf0f8ff), dev->irq);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3244
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3245
	rtl8169_init_phy(dev, tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3246
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3247
	/*
4f6670f083f1 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
4f6670f083f1 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.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3250
	 */
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3252
		RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) | RxVlan);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3253
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3255
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3256
	if (pci_dev_run_wake(pdev))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3257
		pm_runtime_put_noidle(&pdev->dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3258
2582
87e502828b3f Use return value of ecdev_open(); thanks to Patrick Bruenn.
Florian Pose <fp@igh-essen.com>
parents: 2251
diff changeset
  3259
	if (tp->ecdev) {
87e502828b3f Use return value of ecdev_open(); thanks to Patrick Bruenn.
Florian Pose <fp@igh-essen.com>
parents: 2251
diff changeset
  3260
		rc = ecdev_open(tp->ecdev);
87e502828b3f Use return value of ecdev_open(); thanks to Patrick Bruenn.
Florian Pose <fp@igh-essen.com>
parents: 2251
diff changeset
  3261
		if (rc) {
87e502828b3f Use return value of ecdev_open(); thanks to Patrick Bruenn.
Florian Pose <fp@igh-essen.com>
parents: 2251
diff changeset
  3262
			ecdev_withdraw(tp->ecdev);
87e502828b3f Use return value of ecdev_open(); thanks to Patrick Bruenn.
Florian Pose <fp@igh-essen.com>
parents: 2251
diff changeset
  3263
			goto err_out_msi_4;
87e502828b3f Use return value of ecdev_open(); thanks to Patrick Bruenn.
Florian Pose <fp@igh-essen.com>
parents: 2251
diff changeset
  3264
		}
87e502828b3f Use return value of ecdev_open(); thanks to Patrick Bruenn.
Florian Pose <fp@igh-essen.com>
parents: 2251
diff changeset
  3265
	}
87e502828b3f Use return value of ecdev_open(); thanks to Patrick Bruenn.
Florian Pose <fp@igh-essen.com>
parents: 2251
diff changeset
  3266
	else {
2224
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3267
		netif_carrier_off(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3268
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3269
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3270
out:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3271
	return rc;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3272
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3273
err_out_msi_4:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3274
	rtl_disable_msi(pdev, tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3275
	iounmap(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3276
err_out_free_res_3:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3277
	pci_release_regions(pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3278
err_out_mwi_2:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3279
	pci_clear_mwi(pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3280
	pci_disable_device(pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3281
err_out_free_dev_1:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3282
	free_netdev(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3283
	goto out;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3284
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3285
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3286
static void __devexit rtl8169_remove_one(struct pci_dev *pdev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3287
{
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3289
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3290
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3291
	flush_scheduled_work();
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3292
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3293
	if (tp->ecdev) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3294
		ecdev_close(tp->ecdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3295
		ecdev_withdraw(tp->ecdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3296
	} else {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3297
		unregister_netdev(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3298
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3299
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3300
	if (pci_dev_run_wake(pdev))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3301
		pm_runtime_get_noresume(&pdev->dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3302
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3303
	/* restore original MAC address */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3304
	rtl_rar_set(tp, dev->perm_addr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3305
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3306
	rtl_disable_msi(pdev, tp);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3308
	pci_set_drvdata(pdev, NULL);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3309
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3310
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3312
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3313
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3314
	struct pci_dev *pdev = tp->pci_dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3315
	int retval = -ENOMEM;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3316
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3317
	pm_runtime_get_sync(&pdev->dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3318
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3319
	/*
4f6670f083f1 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.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3321
	 * dma_alloc_coherent provides more.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3322
	 */
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3324
					     &tp->TxPhyAddr, GFP_KERNEL);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3325
	if (!tp->TxDescArray)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3326
		goto err_pm_runtime_put;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3327
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3329
					     &tp->RxPhyAddr, GFP_KERNEL);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3330
	if (!tp->RxDescArray)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3331
		goto err_free_tx_0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3332
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3333
	retval = rtl8169_init_ring(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3334
	if (retval < 0)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3335
		goto err_free_rx_1;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3336
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3337
	INIT_DELAYED_WORK(&tp->task, NULL);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3338
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3339
	smp_mb();
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3340
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3341
	if (!tp->ecdev) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3342
		retval = request_irq(dev->irq, rtl8169_interrupt,
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3344
				dev->name, dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3345
		if (retval < 0)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3346
			goto err_release_ring_2;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3347
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3348
		napi_enable(&tp->napi);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3349
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3350
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3351
	rtl_hw_start(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3352
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3353
	rtl8169_request_timer(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3354
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3355
	tp->saved_wolopts = 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3356
	pm_runtime_put_noidle(&pdev->dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3357
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3358
	rtl8169_check_link_status(dev, tp, tp->mmio_addr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3359
out:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3360
	return retval;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3361
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3362
err_release_ring_2:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3363
	rtl8169_rx_clear(tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3364
err_free_rx_1:
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3366
			  tp->RxPhyAddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3367
	tp->RxDescArray = NULL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3368
err_free_tx_0:
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3370
			  tp->TxPhyAddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3371
	tp->TxDescArray = NULL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3372
err_pm_runtime_put:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3373
	pm_runtime_put_noidle(&pdev->dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3374
	goto out;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3375
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3376
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3378
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3379
	/* Disable interrupts */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3380
	rtl8169_irq_mask_and_ack(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3381
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3382
	/* Reset the chipset */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3383
	RTL_W8(ChipCmd, CmdReset);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3384
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3385
	/* PCI commit */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3386
	RTL_R8(ChipCmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3387
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3388
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3390
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3391
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3392
	u32 cfg = rtl8169_rx_config;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3393
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3395
	RTL_W32(RxConfig, cfg);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3396
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3398
	RTL_W32(TxConfig, (TX_DMA_BURST << TxDMAShift) |
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3399
		(InterFrameGap << TxInterFrameGapShift));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3400
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3401
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3402
static void rtl_hw_start(struct net_device *dev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3403
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3404
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3405
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3406
	unsigned int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3407
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3408
	/* Soft reset the chip. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3409
	RTL_W8(ChipCmd, CmdReset);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3410
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3411
	/* Check that the chip has finished the reset. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3412
	for (i = 0; i < 100; i++) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3413
		if ((RTL_R8(ChipCmd) & CmdReset) == 0)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3414
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3415
		msleep_interruptible(1);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3416
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3417
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3418
	tp->hw_start(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3419
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3420
	if (!tp->ecdev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3421
		netif_start_queue(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3422
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3423
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3424
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3426
					 void __iomem *ioaddr)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3427
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3428
	/*
4f6670f083f1 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
4f6670f083f1 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.
4f6670f083f1 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.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3432
	 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3433
	RTL_W32(TxDescStartAddrHigh, ((u64) tp->TxPhyAddr) >> 32);
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3435
	RTL_W32(RxDescAddrHigh, ((u64) tp->RxPhyAddr) >> 32);
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3437
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3438
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3439
static u16 rtl_rw_cpluscmd(void __iomem *ioaddr)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3440
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3441
	u16 cmd;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3442
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3443
	cmd = RTL_R16(CPlusCmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3444
	RTL_W16(CPlusCmd, cmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3445
	return cmd;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3446
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3447
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3449
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3450
	/* Low hurts. Let's disable the filtering. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3451
	RTL_W16(RxMaxSize, rx_buf_sz + 1);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3452
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3453
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3455
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3456
	static const struct {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3457
		u32 mac_version;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3458
		u32 clk;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3459
		u32 val;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3460
	} cfg2_info [] = {
4f6670f083f1 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
4f6670f083f1 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 },
4f6670f083f1 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
4f6670f083f1 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 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3465
	}, *p = cfg2_info;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3466
	unsigned int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3467
	u32 clk;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3468
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3469
	clk = RTL_R8(Config2) & PCI_Clock_66MHz;
4f6670f083f1 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++) {
4f6670f083f1 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)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3472
			RTL_W32(0x7c, p->val);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3473
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3474
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3475
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3476
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3477
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3478
static void rtl_hw_start_8169(struct net_device *dev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3479
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3480
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3481
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3482
	struct pci_dev *pdev = tp->pci_dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3483
4f6670f083f1 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) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3485
		RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) | PCIMulRW);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3487
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3488
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3489
	RTL_W8(Cfg9346, Cfg9346_Unlock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3490
	if ((tp->mac_version == RTL_GIGA_MAC_VER_01) ||
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3491
	    (tp->mac_version == RTL_GIGA_MAC_VER_02) ||
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3492
	    (tp->mac_version == RTL_GIGA_MAC_VER_03) ||
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3493
	    (tp->mac_version == RTL_GIGA_MAC_VER_04))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3494
		RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3495
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3496
	RTL_W8(EarlyTxThres, EarlyTxThld);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3497
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3498
	rtl_set_rx_max_size(ioaddr, rx_buf_sz);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3499
4f6670f083f1 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) ||
4f6670f083f1 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) ||
4f6670f083f1 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) ||
4f6670f083f1 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))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3504
		rtl_set_rx_tx_config_registers(tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3505
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3507
4f6670f083f1 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) ||
4f6670f083f1 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)) {
4f6670f083f1 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. "
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3512
		tp->cp_cmd |= (1 << 14);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3513
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3514
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3515
	RTL_W16(CPlusCmd, tp->cp_cmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3516
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3518
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3519
	/*
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3520
	 * Undocumented corner. Supposedly:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3521
	 * (TxTimer << 12) | (TxPackets << 8) | (RxTimer << 4) | RxPackets
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3522
	 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3523
	RTL_W16(IntrMitigate, 0x0000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3524
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3526
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3527
	if ((tp->mac_version != RTL_GIGA_MAC_VER_01) &&
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3528
	    (tp->mac_version != RTL_GIGA_MAC_VER_02) &&
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3529
	    (tp->mac_version != RTL_GIGA_MAC_VER_03) &&
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3530
	    (tp->mac_version != RTL_GIGA_MAC_VER_04)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3531
		RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3532
		rtl_set_rx_tx_config_registers(tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3533
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3534
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3535
	RTL_W8(Cfg9346, Cfg9346_Lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3536
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3537
	/* Initially a 10 us delay. Turned it into a PCI commit. - FR */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3538
	RTL_R8(IntrMask);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3539
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3540
	RTL_W32(RxMissed, 0);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3541
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3542
	rtl_set_rx_mode(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3543
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3544
	/* no early-rx interrupts */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3545
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xF000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3546
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3547
	/* Enable all known interrupts by setting the interrupt mask. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3548
	if (!tp->ecdev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3549
		RTL_W16(IntrMask, tp->intr_event);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3550
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3551
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3552
static void rtl_tx_performance_tweak(struct pci_dev *pdev, u16 force)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3553
{
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3555
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3556
	int cap = tp->pcie_cap;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3557
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3558
	if (cap) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3559
		u16 ctl;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3560
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3562
		ctl = (ctl & ~PCI_EXP_DEVCTL_READRQ) | force;
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3564
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3565
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3566
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3567
static void rtl_csi_access_enable(void __iomem *ioaddr)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3568
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3569
	u32 csi;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3570
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3571
	csi = rtl_csi_read(ioaddr, 0x070c) & 0x00ffffff;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3572
	rtl_csi_write(ioaddr, 0x070c, csi | 0x27000000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3573
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3574
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3575
struct ephy_info {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3576
	unsigned int offset;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3577
	u16 mask;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3578
	u16 bits;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3579
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3580
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3582
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3583
	u16 w;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3584
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3585
	while (len-- > 0) {
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3587
		rtl_ephy_write(ioaddr, e->offset, w);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3588
		e++;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3589
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3590
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3591
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3592
static void rtl_disable_clock_request(struct pci_dev *pdev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3593
{
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3595
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3596
	int cap = tp->pcie_cap;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3597
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3598
	if (cap) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3599
		u16 ctl;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3600
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3601
		pci_read_config_word(pdev, cap + PCI_EXP_LNKCTL, &ctl);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3602
		ctl &= ~PCI_EXP_LNKCTL_CLKREQ_EN;
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3604
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3605
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3606
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3607
#define R8168_CPCMD_QUIRK_MASK (\
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3608
	EnableBist | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3609
	Mac_dbgo_oe | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3610
	Force_half_dup | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3611
	Force_rxflow_en | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3612
	Force_txflow_en | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3613
	Cxpl_dbg_sel | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3614
	ASF | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3615
	PktCntrDisable | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3616
	Mac_dbgo_sel)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3617
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3619
{
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3621
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3622
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3623
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3624
	rtl_tx_performance_tweak(pdev,
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3626
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3627
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3628
static void rtl_hw_start_8168bef(void __iomem *ioaddr, struct pci_dev *pdev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3629
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3630
	rtl_hw_start_8168bb(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3631
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3632
	RTL_W8(EarlyTxThres, EarlyTxThld);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3633
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3635
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3636
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3637
static void __rtl_hw_start_8168cp(void __iomem *ioaddr, struct pci_dev *pdev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3638
{
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3640
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3642
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3644
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3645
	rtl_disable_clock_request(pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3646
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3648
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3649
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3651
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3653
		{ 0x01, 0,	0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3654
		{ 0x02, 0x0800,	0x1000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3655
		{ 0x03, 0,	0x0042 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3656
		{ 0x06, 0x0080,	0x0000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3657
		{ 0x07, 0,	0x2000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3658
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3659
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3660
	rtl_csi_access_enable(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3661
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3663
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3664
	__rtl_hw_start_8168cp(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3665
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3666
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3668
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3669
	rtl_csi_access_enable(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3670
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3672
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3673
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3674
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3676
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3677
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3679
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3680
	rtl_csi_access_enable(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3681
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3682
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3683
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3684
	/* Magic. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3685
	RTL_W8(DBG_REG, 0x20);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3686
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3687
	RTL_W8(EarlyTxThres, EarlyTxThld);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3688
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3689
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3690
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3692
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3693
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3694
static void rtl_hw_start_8168c_1(void __iomem *ioaddr, struct pci_dev *pdev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3695
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3697
		{ 0x02, 0x0800,	0x1000 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3698
		{ 0x03, 0,	0x0002 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3699
		{ 0x06, 0x0080,	0x0000 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3700
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3701
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3702
	rtl_csi_access_enable(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3703
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3705
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3707
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3708
	__rtl_hw_start_8168cp(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3709
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3710
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3711
static void rtl_hw_start_8168c_2(void __iomem *ioaddr, struct pci_dev *pdev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3712
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3714
		{ 0x01, 0,	0x0001 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3715
		{ 0x03, 0x0400,	0x0220 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3716
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3717
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3718
	rtl_csi_access_enable(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3719
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3720
	rtl_ephy_init(ioaddr, e_info_8168c_2, ARRAY_SIZE(e_info_8168c_2));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3721
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3722
	__rtl_hw_start_8168cp(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3723
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3724
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3726
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3727
	rtl_hw_start_8168c_2(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3728
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3729
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3730
static void rtl_hw_start_8168c_4(void __iomem *ioaddr, struct pci_dev *pdev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3731
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3732
	rtl_csi_access_enable(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3733
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3734
	__rtl_hw_start_8168cp(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3735
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3736
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3737
static void rtl_hw_start_8168d(void __iomem *ioaddr, struct pci_dev *pdev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3738
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3739
	rtl_csi_access_enable(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3740
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3741
	rtl_disable_clock_request(pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3742
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3743
	RTL_W8(EarlyTxThres, EarlyTxThld);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3744
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3746
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3748
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3749
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3751
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3752
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3753
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3754
	struct pci_dev *pdev = tp->pci_dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3755
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3756
	RTL_W8(Cfg9346, Cfg9346_Unlock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3757
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3758
	RTL_W8(EarlyTxThres, EarlyTxThld);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3759
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3760
	rtl_set_rx_max_size(ioaddr, rx_buf_sz);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3761
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3763
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3764
	RTL_W16(CPlusCmd, tp->cp_cmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3765
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3766
	RTL_W16(IntrMitigate, 0x5151);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3767
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3768
	/* Work around for RxFIFO overflow. */
4f6670f083f1 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 ||
4f6670f083f1 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) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3771
		tp->intr_event |= RxFIFOOver | PCSTimeout;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3772
		tp->intr_event &= ~RxOverflow;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3773
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3774
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3776
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3777
	rtl_set_rx_mode(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3778
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3779
	RTL_W32(TxConfig, (TX_DMA_BURST << TxDMAShift) |
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3780
		(InterFrameGap << TxInterFrameGapShift));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3781
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3782
	RTL_R8(IntrMask);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3783
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3784
	switch (tp->mac_version) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3785
	case RTL_GIGA_MAC_VER_11:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3786
		rtl_hw_start_8168bb(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3787
	break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3788
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3789
	case RTL_GIGA_MAC_VER_12:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3790
	case RTL_GIGA_MAC_VER_17:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3791
		rtl_hw_start_8168bef(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3792
	break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3793
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3794
	case RTL_GIGA_MAC_VER_18:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3795
		rtl_hw_start_8168cp_1(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3796
	break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3797
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3798
	case RTL_GIGA_MAC_VER_19:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3799
		rtl_hw_start_8168c_1(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3800
	break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3801
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3802
	case RTL_GIGA_MAC_VER_20:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3803
		rtl_hw_start_8168c_2(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3804
	break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3805
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3806
	case RTL_GIGA_MAC_VER_21:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3807
		rtl_hw_start_8168c_3(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3808
	break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3809
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3810
	case RTL_GIGA_MAC_VER_22:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3811
		rtl_hw_start_8168c_4(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3812
	break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3813
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3814
	case RTL_GIGA_MAC_VER_23:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3815
		rtl_hw_start_8168cp_2(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3816
	break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3817
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3818
	case RTL_GIGA_MAC_VER_24:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3819
		rtl_hw_start_8168cp_3(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3820
	break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3821
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3822
	case RTL_GIGA_MAC_VER_25:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3823
	case RTL_GIGA_MAC_VER_26:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3824
	case RTL_GIGA_MAC_VER_27:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3825
		rtl_hw_start_8168d(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3826
	break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3827
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3828
	default:
4f6670f083f1 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",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3830
			dev->name, tp->mac_version);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3831
	break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3832
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3833
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3834
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3835
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3836
	RTL_W8(Cfg9346, Cfg9346_Lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3837
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3838
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xF000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3839
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3840
	if (!tp->ecdev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3841
		RTL_W16(IntrMask, tp->intr_event);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3842
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3843
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3844
#define R810X_CPCMD_QUIRK_MASK (\
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3845
	EnableBist | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3846
	Mac_dbgo_oe | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3847
	Force_half_dup | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3848
	Force_rxflow_en | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3849
	Force_txflow_en | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3850
	Cxpl_dbg_sel | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3851
	ASF | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3852
	PktCntrDisable | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3853
	PCIDAC | \
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3854
	PCIMulRW)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3855
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3856
static void rtl_hw_start_8102e_1(void __iomem *ioaddr, struct pci_dev *pdev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3857
{
4f6670f083f1 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[] = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3859
		{ 0x01,	0, 0x6e65 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3860
		{ 0x02,	0, 0x091f },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3861
		{ 0x03,	0, 0xc2f9 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3862
		{ 0x06,	0, 0xafb5 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3863
		{ 0x07,	0, 0x0e00 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3864
		{ 0x19,	0, 0xec80 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3865
		{ 0x01,	0, 0x2e65 },
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3866
		{ 0x01,	0, 0x6e65 }
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3867
	};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3868
	u8 cfg1;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3869
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3870
	rtl_csi_access_enable(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3871
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3872
	RTL_W8(DBG_REG, FIX_NAK_1);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3873
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3875
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3876
	RTL_W8(Config1,
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3879
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3880
	cfg1 = RTL_R8(Config1);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3881
	if ((cfg1 & LEDS0) && (cfg1 & LEDS1))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3882
		RTL_W8(Config1, cfg1 & ~LEDS0);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3883
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3884
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R810X_CPCMD_QUIRK_MASK);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3885
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3887
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3888
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3890
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3891
	rtl_csi_access_enable(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3892
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3894
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3895
	RTL_W8(Config1, MEMMAP | IOMAP | VPD | PMEnable);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3897
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3898
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R810X_CPCMD_QUIRK_MASK);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3899
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3900
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3901
static void rtl_hw_start_8102e_3(void __iomem *ioaddr, struct pci_dev *pdev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3902
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3903
	rtl_hw_start_8102e_2(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3904
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3905
	rtl_ephy_write(ioaddr, 0x03, 0xc2f9);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3906
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3907
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3909
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3910
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3911
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3912
	struct pci_dev *pdev = tp->pci_dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3913
4f6670f083f1 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) ||
4f6670f083f1 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)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3916
		int cap = tp->pcie_cap;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3917
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3918
		if (cap) {
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3920
					      PCI_EXP_DEVCTL_NOSNOOP_EN);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3921
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3922
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3923
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3924
	switch (tp->mac_version) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3925
	case RTL_GIGA_MAC_VER_07:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3926
		rtl_hw_start_8102e_1(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3927
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3928
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3929
	case RTL_GIGA_MAC_VER_08:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3930
		rtl_hw_start_8102e_3(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3931
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3932
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3933
	case RTL_GIGA_MAC_VER_09:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3934
		rtl_hw_start_8102e_2(ioaddr, pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3935
		break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3936
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3937
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3938
	RTL_W8(Cfg9346, Cfg9346_Unlock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3939
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3940
	RTL_W8(EarlyTxThres, EarlyTxThld);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3941
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3943
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3944
	tp->cp_cmd |= rtl_rw_cpluscmd(ioaddr) | PCIMulRW;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3945
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3946
	RTL_W16(CPlusCmd, tp->cp_cmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3947
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3948
	RTL_W16(IntrMitigate, 0x0000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3949
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3950
	rtl_set_rx_tx_desc_registers(tp, ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3951
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3952
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3953
	rtl_set_rx_tx_config_registers(tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3954
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3955
	RTL_W8(Cfg9346, Cfg9346_Lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3956
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3957
	RTL_R8(IntrMask);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3958
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3959
	rtl_set_rx_mode(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3960
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3961
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3962
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3963
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xf000);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3964
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3965
	if (!tp->ecdev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3966
		RTL_W16(IntrMask, tp->intr_event);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3967
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3968
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3969
static int rtl8169_change_mtu(struct net_device *dev, int new_mtu)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3970
{
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3972
		return -EINVAL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3973
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3974
	dev->mtu = new_mtu;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3975
	return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3976
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3977
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3978
static inline void rtl8169_make_unusable_by_asic(struct RxDesc *desc)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3979
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3980
	desc->addr = cpu_to_le64(0x0badbadbadbadbadull);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3981
	desc->opts1 &= ~cpu_to_le32(DescOwn | RsvdMask);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3982
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3983
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3984
static void rtl8169_free_rx_databuff(struct rtl8169_private *tp,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3985
				     void **data_buff, struct RxDesc *desc)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3986
{
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3988
			 DMA_FROM_DEVICE);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3989
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3990
	kfree(*data_buff);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3991
	*data_buff = NULL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3992
	rtl8169_make_unusable_by_asic(desc);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3993
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3994
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3995
static inline void rtl8169_mark_to_asic(struct RxDesc *desc, u32 rx_buf_sz)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3996
{
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3998
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4000
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4001
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4002
static inline void rtl8169_map_to_asic(struct RxDesc *desc, dma_addr_t mapping,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4003
				       u32 rx_buf_sz)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4004
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4005
	desc->addr = cpu_to_le64(mapping);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4006
	wmb();
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4008
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4009
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4010
static inline void *rtl8169_align(void *data)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4011
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4012
	return (void *)ALIGN((long)data, 16);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4013
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4014
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4015
static struct sk_buff *rtl8169_alloc_rx_data(struct rtl8169_private *tp,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4016
					     struct RxDesc *desc)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4017
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4018
	void *data;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4019
	dma_addr_t mapping;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4020
	struct device *d = &tp->pci_dev->dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4021
	struct net_device *dev = tp->dev;
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4023
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4025
	if (!data)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4026
		return NULL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4027
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4028
	if (rtl8169_align(data) != data) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4029
		kfree(data);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4031
		if (!data)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4032
			return NULL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4033
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4034
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4035
	mapping = dma_map_single(d, rtl8169_align(data), rx_buf_sz,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4036
				 DMA_FROM_DEVICE);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4037
	if (unlikely(dma_mapping_error(d, mapping))) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4038
		if (net_ratelimit())
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4040
		goto err_out;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4041
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4042
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4043
	rtl8169_map_to_asic(desc, mapping, rx_buf_sz);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4044
	return data;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4045
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4046
err_out:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4047
	kfree(data);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4048
	return NULL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4049
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4050
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4052
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4053
	unsigned int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4054
4f6670f083f1 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++) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4056
		if (tp->Rx_databuff[i]) {
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4058
					    tp->RxDescArray + i);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4059
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4060
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4061
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4062
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4063
static inline void rtl8169_mark_as_last_descriptor(struct RxDesc *desc)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4064
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4065
	desc->opts1 |= cpu_to_le32(RingEnd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4066
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4067
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4068
static int rtl8169_rx_fill(struct rtl8169_private *tp)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4069
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4070
	unsigned int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4071
4f6670f083f1 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++) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4073
		void *data;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4074
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4075
		if (tp->Rx_databuff[i])
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4076
			continue;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4077
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4078
		data = rtl8169_alloc_rx_data(tp, tp->RxDescArray + i);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4079
		if (!data) {
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4081
			goto err_out;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4082
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4083
		tp->Rx_databuff[i] = data;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4084
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4085
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4087
	return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4088
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4089
err_out:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4090
	rtl8169_rx_clear(tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4091
	return -ENOMEM;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4092
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4093
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4094
static void rtl8169_init_ring_indexes(struct rtl8169_private *tp)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4095
{
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4097
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4098
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4100
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4101
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4102
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4103
	rtl8169_init_ring_indexes(tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4104
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4105
	memset(tp->tx_skb, 0x0, NUM_TX_DESC * sizeof(struct ring_info));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4106
	memset(tp->Rx_databuff, 0x0, NUM_RX_DESC * sizeof(void *));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4107
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4108
	return rtl8169_rx_fill(tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4109
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4110
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4112
				 struct TxDesc *desc)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4113
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4114
	unsigned int len = tx_skb->len;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4115
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4116
	dma_unmap_single(d, le64_to_cpu(desc->addr), len, DMA_TO_DEVICE);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4117
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4118
	desc->opts1 = 0x00;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4119
	desc->opts2 = 0x00;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4120
	desc->addr = 0x00;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4121
	tx_skb->len = 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4122
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4123
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4124
static void rtl8169_tx_clear_range(struct rtl8169_private *tp, u32 start,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4125
				   unsigned int n)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4126
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4127
	unsigned int i;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4128
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4129
	for (i = 0; i < n; i++) {
4f6670f083f1 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;
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4132
		unsigned int len = tx_skb->len;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4133
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4134
		if (len) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4135
			struct sk_buff *skb = tx_skb->skb;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4136
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4138
					     tp->TxDescArray + entry);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4139
			if (skb) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4140
				tp->dev->stats.tx_dropped++;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4141
				if (!tp->ecdev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4142
					dev_kfree_skb(skb);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4143
				tx_skb->skb = NULL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4144
			}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4145
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4146
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4147
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4148
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4150
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4151
	rtl8169_tx_clear_range(tp, tp->dirty_tx, NUM_TX_DESC);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4152
	tp->cur_tx = tp->dirty_tx = 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4153
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4154
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4156
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4157
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4158
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4159
	PREPARE_DELAYED_WORK(&tp->task, task);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4160
	schedule_delayed_work(&tp->task, 4);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4161
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4162
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4163
static void rtl8169_wait_for_quiescence(struct net_device *dev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4164
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4165
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4166
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4167
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4168
	synchronize_irq(dev->irq);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4169
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4171
	napi_disable(&tp->napi);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4172
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4173
	rtl8169_irq_mask_and_ack(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4174
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4175
	tp->intr_mask = 0xffff;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4176
	RTL_W16(IntrMask, tp->intr_event);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4177
	napi_enable(&tp->napi);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4178
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4179
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4180
static void rtl8169_reinit_task(struct work_struct *work)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4181
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4182
	struct rtl8169_private *tp =
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4184
	struct net_device *dev = tp->dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4185
	int ret;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4186
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4187
	rtnl_lock();
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4188
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4189
	if (!netif_running(dev))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4190
		goto out_unlock;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4191
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4192
	rtl8169_wait_for_quiescence(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4193
	rtl8169_close(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4194
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4195
	ret = rtl8169_open(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4196
	if (unlikely(ret < 0)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4197
		if (net_ratelimit())
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4198
			netif_err(tp, drv, dev,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4199
				  "reinit failure (status = %d). Rescheduling\n",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4200
				  ret);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4201
		rtl8169_schedule_work(dev, rtl8169_reinit_task);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4202
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4203
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4204
out_unlock:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4205
	rtnl_unlock();
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4206
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4207
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4208
static void rtl8169_reset_task(struct work_struct *work)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4209
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4210
	struct rtl8169_private *tp =
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4212
	struct net_device *dev = tp->dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4213
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4214
	rtnl_lock();
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4215
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4216
	if (!netif_running(dev))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4217
		goto out_unlock;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4218
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4219
	rtl8169_wait_for_quiescence(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4220
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4222
	rtl8169_tx_clear(tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4223
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4224
	if (tp->dirty_rx == tp->cur_rx) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4225
		rtl8169_init_ring_indexes(tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4226
		rtl_hw_start(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4227
		netif_wake_queue(dev);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4229
	} else {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4230
		if (net_ratelimit())
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4231
			netif_emerg(tp, intr, dev, "Rx buffers shortage\n");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4232
		rtl8169_schedule_work(dev, rtl8169_reset_task);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4233
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4234
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4235
out_unlock:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4236
	rtnl_unlock();
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4237
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4238
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4239
static void rtl8169_tx_timeout(struct net_device *dev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4240
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4241
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4242
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4243
	if (tp->ecdev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4244
		return;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4245
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4246
	rtl8169_hw_reset(tp->mmio_addr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4247
4f6670f083f1 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 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4249
	rtl8169_schedule_work(dev, rtl8169_reset_task);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4250
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4251
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4252
static int rtl8169_xmit_frags(struct rtl8169_private *tp, struct sk_buff *skb,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4253
			      u32 opts1)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4254
{
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4256
	unsigned int cur_frag, entry;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4257
	struct TxDesc * uninitialized_var(txd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4258
	struct device *d = &tp->pci_dev->dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4259
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4260
	entry = tp->cur_tx;
4f6670f083f1 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++) {
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4263
		dma_addr_t mapping;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4264
		u32 status, len;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4265
		void *addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4266
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4267
		entry = (entry + 1) % NUM_TX_DESC;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4268
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4269
		txd = tp->TxDescArray + entry;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4270
		len = frag->size;
4f6670f083f1 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;
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4273
		if (unlikely(dma_mapping_error(d, mapping))) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4274
			if (net_ratelimit())
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4275
				netif_err(tp, drv, tp->dev,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4276
					  "Failed to map TX fragments DMA!\n");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4277
			goto err_out;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4278
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4279
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4280
		/* anti gcc 2.95.3 bugware (sic) */
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4282
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4283
		txd->opts1 = cpu_to_le32(status);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4284
		txd->addr = cpu_to_le64(mapping);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4285
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4286
		tp->tx_skb[entry].len = len;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4287
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4288
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4289
	if (cur_frag) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4290
		tp->tx_skb[entry].skb = skb;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4291
		txd->opts1 |= cpu_to_le32(LastFrag);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4292
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4293
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4294
	return cur_frag;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4295
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4296
err_out:
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4298
	return -EIO;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4299
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4300
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4302
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4303
	if (dev->features & NETIF_F_TSO) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4304
		u32 mss = skb_shinfo(skb)->gso_size;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4305
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4306
		if (mss)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4307
			return LargeSend | ((mss & MSSMask) << MSSShift);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4308
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4309
	if (skb->ip_summed == CHECKSUM_PARTIAL) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4310
		const struct iphdr *ip = ip_hdr(skb);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4311
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4312
		if (ip->protocol == IPPROTO_TCP)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4313
			return IPCS | TCPCS;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4314
		else if (ip->protocol == IPPROTO_UDP)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4315
			return IPCS | UDPCS;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4316
		WARN_ON(1);	/* we need a WARN() */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4317
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4318
	return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4319
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4320
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4321
static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4322
				      struct net_device *dev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4323
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4324
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4326
	struct TxDesc *txd = tp->TxDescArray + entry;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4327
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4328
	struct device *d = &tp->pci_dev->dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4329
	dma_addr_t mapping;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4330
	u32 status, len;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4331
	u32 opts1;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4332
	int frags;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4333
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4334
	if (unlikely(TX_BUFFS_AVAIL(tp) < skb_shinfo(skb)->nr_frags)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4335
		netif_err(tp, drv, dev, "BUG! Tx Ring full when queue awake!\n");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4336
		goto err_stop_0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4337
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4338
4f6670f083f1 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))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4340
		goto err_stop_0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4341
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4342
	len = skb_headlen(skb);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4344
	if (unlikely(dma_mapping_error(d, mapping))) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4345
		if (net_ratelimit())
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4347
		goto err_dma_0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4348
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4349
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4350
	tp->tx_skb[entry].len = len;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4351
	txd->addr = cpu_to_le64(mapping);
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4353
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4354
	opts1 = DescOwn | rtl8169_tso_csum(skb, dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4355
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4356
	frags = rtl8169_xmit_frags(tp, skb, opts1);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4357
	if (frags < 0)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4358
		goto err_dma_1;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4359
	else if (frags)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4360
		opts1 |= FirstFrag;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4361
	else {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4362
		opts1 |= FirstFrag | LastFrag;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4363
		tp->tx_skb[entry].skb = skb;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4364
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4365
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4366
	wmb();
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4367
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4368
	/* anti gcc 2.95.3 bugware (sic) */
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4370
	txd->opts1 = cpu_to_le32(status);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4371
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4372
	tp->cur_tx += frags + 1;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4373
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4374
	wmb();
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4375
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4376
	RTL_W8(TxPoll, NPQ);	/* set polling bit */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4377
4f6670f083f1 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) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4379
		netif_stop_queue(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4380
		smp_rmb();
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4382
			netif_wake_queue(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4383
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4384
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4385
	return NETDEV_TX_OK;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4386
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4387
err_dma_1:
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4389
err_dma_0:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4390
	if (!tp->ecdev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4391
		dev_kfree_skb(skb);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4392
	dev->stats.tx_dropped++;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4393
	return NETDEV_TX_OK;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4394
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4395
err_stop_0:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4396
	if (!tp->ecdev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4397
		netif_stop_queue(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4398
	dev->stats.tx_dropped++;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4399
	return NETDEV_TX_BUSY;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4400
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4401
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4402
static void rtl8169_pcierr_interrupt(struct net_device *dev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4403
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4404
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4405
	struct pci_dev *pdev = tp->pci_dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4406
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4407
	u16 pci_status, pci_cmd;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4408
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4411
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4412
	netif_err(tp, intr, dev, "PCI error (cmd = 0x%04x, status = 0x%04x)\n",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4413
		  pci_cmd, pci_status);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4414
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4415
	/*
4f6670f083f1 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:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4417
	 * - it seems to work;
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4419
	 * - it makes iop3xx happy.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4420
	 *
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4421
	 * Feel free to adjust to your needs.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4422
	 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4423
	if (pdev->broken_parity_status)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4424
		pci_cmd &= ~PCI_COMMAND_PARITY;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4425
	else
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4427
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4429
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4430
	pci_write_config_word(pdev, PCI_STATUS,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4431
		pci_status & (PCI_STATUS_DETECTED_PARITY |
4f6670f083f1 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 |
4f6670f083f1 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));
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4434
4f6670f083f1 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 */
4f6670f083f1 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) {
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4438
		tp->cp_cmd &= ~PCIDAC;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4439
		RTL_W16(CPlusCmd, tp->cp_cmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4440
		dev->features &= ~NETIF_F_HIGHDMA;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4441
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4442
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4443
	rtl8169_hw_reset(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4444
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4445
	rtl8169_schedule_work(dev, rtl8169_reinit_task);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4446
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4447
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4449
				 struct rtl8169_private *tp,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4450
				 void __iomem *ioaddr)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4451
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4452
	unsigned int dirty_tx, tx_left;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4453
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4454
	dirty_tx = tp->dirty_tx;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4455
	smp_rmb();
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4456
	tx_left = tp->cur_tx - dirty_tx;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4457
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4458
	while (tx_left > 0) {
4f6670f083f1 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;
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4461
		u32 status;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4462
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4463
		rmb();
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4465
		if (status & DescOwn)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4466
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4467
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4468
		rtl8169_unmap_tx_skb(&tp->pci_dev->dev, tx_skb,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4469
				     tp->TxDescArray + entry);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4470
		if (status & LastFrag) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4471
			dev->stats.tx_packets++;
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4473
			if (!tp->ecdev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4474
				dev_kfree_skb(tx_skb->skb);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4475
			tx_skb->skb = NULL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4476
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4477
		dirty_tx++;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4478
		tx_left--;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4479
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4480
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4481
	if (tp->dirty_tx != dirty_tx) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4482
		tp->dirty_tx = dirty_tx;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4483
		smp_wmb();
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4484
		if (!tp->ecdev && netif_queue_stopped(dev) &&
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4485
		    (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4486
			netif_wake_queue(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4487
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4488
		/*
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4489
		 * 8168 hack: TxPoll requests are lost when the Tx packets are
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4490
		 * too close. Let's kick an extra TxPoll request when a burst
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4491
		 * of start_xmit activity is detected (if it is not detected,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4492
		 * it is slow enough). -- FR
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4493
		 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4494
		smp_rmb();
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4495
		if (tp->cur_tx != dirty_tx)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4496
			RTL_W8(TxPoll, NPQ);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4497
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4498
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4499
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4501
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4502
	return (status & (FirstFrag | LastFrag)) != (FirstFrag | LastFrag);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4503
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4504
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4506
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4507
	u32 status = opts1 & RxProtoMask;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4508
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4509
	if (((status == RxProtoTCP) && !(opts1 & TCPFail)) ||
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4510
	    ((status == RxProtoUDP) && !(opts1 & UDPFail)))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4511
		skb->ip_summed = CHECKSUM_UNNECESSARY;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4512
	else
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4513
		skb_checksum_none_assert(skb);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4514
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4515
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4517
					   struct rtl8169_private *tp,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4518
					   int pkt_size,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4519
					   dma_addr_t addr)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4520
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4521
	struct sk_buff *skb;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4522
	struct device *d = &tp->pci_dev->dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4523
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4524
	data = rtl8169_align(data);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4526
	prefetch(data);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4528
	if (skb)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4529
		memcpy(skb->data, data, pkt_size);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4531
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4532
	return skb;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4533
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4534
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4535
/*
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4536
 * Warning : rtl8169_rx_interrupt() might be called :
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4537
 * 1) from NAPI (softirq) context
4f6670f083f1 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())
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4539
 * 2) from process context (rtl8169_reset_task())
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4541
 */
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4543
				struct rtl8169_private *tp,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4544
				void __iomem *ioaddr, u32 budget)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4545
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4546
	unsigned int cur_rx, rx_left;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4547
	unsigned int count;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4548
	int polling = (budget != ~(u32)0) ? 1 : 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4549
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4550
	cur_rx = tp->cur_rx;
4f6670f083f1 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;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4552
	rx_left = min(rx_left, budget);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4553
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4554
	for (; rx_left > 0; rx_left--, cur_rx++) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4555
		unsigned int entry = cur_rx % NUM_RX_DESC;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4556
		struct RxDesc *desc = tp->RxDescArray + entry;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4557
		u32 status;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4558
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4559
		rmb();
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4560
		status = le32_to_cpu(desc->opts1);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4561
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4562
		if (status & DescOwn)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4563
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4564
		if (unlikely(status & RxRES)) {
4f6670f083f1 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",
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4566
				   status);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4567
			dev->stats.rx_errors++;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4568
			if (status & (RxRWT | RxRUNT))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4569
				dev->stats.rx_length_errors++;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4570
			if (status & RxCRC)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4571
				dev->stats.rx_crc_errors++;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4572
			if (status & RxFOVF) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4573
				if (!tp->ecdev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4574
					rtl8169_schedule_work(dev, rtl8169_reset_task);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4575
				dev->stats.rx_fifo_errors++;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4576
			}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4577
			rtl8169_mark_to_asic(desc, rx_buf_sz);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4578
		} else {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4579
			struct sk_buff *skb;
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4581
			int pkt_size = (status & 0x00001FFF) - 4;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4582
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4583
			/*
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4584
			 * The driver does not support incoming fragmented
4f6670f083f1 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
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4586
			 * sized frames.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4587
			 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4588
			if (unlikely(rtl8169_fragmented_frame(status))) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4589
				dev->stats.rx_dropped++;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4590
				dev->stats.rx_length_errors++;
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4592
				continue;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4593
			}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4594
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4595
			if (tp->ecdev) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4596
				/* reusing parts of rtl8169_try_rx_copy() */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4597
                struct device *d = &tp->pci_dev->dev;
4f6670f083f1 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]);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4600
				prefetch(data);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4601
				ecdev_receive(tp->ecdev, data, pkt_size);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4603
			} else {
4f6670f083f1 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],
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4605
							  tp, pkt_size, addr);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4607
				if (!skb) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4608
					dev->stats.rx_dropped++;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4609
					continue;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4610
				}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4611
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4612
				rtl8169_rx_csum(skb, status);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4613
				skb_put(skb, pkt_size);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4614
				skb->protocol = eth_type_trans(skb, dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4615
4f6670f083f1 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) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4617
					if (likely(polling))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4618
						napi_gro_receive(&tp->napi, skb);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4619
					else
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4620
						netif_rx(skb);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4621
				}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4622
			}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4623
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4624
			dev->stats.rx_bytes += pkt_size;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4625
			dev->stats.rx_packets++;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4626
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4627
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4628
		/* Work around for AMD plateform. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4629
		if ((desc->opts2 & cpu_to_le32(0xfffe000)) &&
4f6670f083f1 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)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4631
			desc->opts2 = 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4632
			cur_rx++;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4633
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4634
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4635
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4636
	count = cur_rx - tp->cur_rx;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4637
	tp->cur_rx = cur_rx;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4638
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4639
	tp->dirty_rx += count;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4640
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4641
	return count;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4642
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4643
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4645
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4646
	struct net_device *dev = dev_instance;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4647
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4648
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4649
	int handled = 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4650
	int status;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4651
4f6670f083f1 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
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4653
	 * we hit a invalid/hotplug case.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4654
	 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4655
	status = RTL_R16(IntrStatus);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4656
	while (status && status != 0xffff) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4657
		handled = 1;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4658
4f6670f083f1 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
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4660
		 * the chip, so just exit the loop.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4661
		 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4662
		if (unlikely(!tp->ecdev && !netif_running(dev))) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4663
			rtl8169_asic_down(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4664
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4665
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4666
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4667
		if (unlikely(status & RxFIFOOver)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4668
			switch (tp->mac_version) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4669
			/* Work around for rx fifo overflow */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4670
			case RTL_GIGA_MAC_VER_11:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4671
			case RTL_GIGA_MAC_VER_22:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4672
			case RTL_GIGA_MAC_VER_26:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4673
				netif_stop_queue(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4674
				rtl8169_tx_timeout(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4675
				goto done;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4676
			/* Testers needed. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4677
			case RTL_GIGA_MAC_VER_17:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4678
			case RTL_GIGA_MAC_VER_19:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4679
			case RTL_GIGA_MAC_VER_20:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4680
			case RTL_GIGA_MAC_VER_21:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4681
			case RTL_GIGA_MAC_VER_23:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4682
			case RTL_GIGA_MAC_VER_24:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4683
			case RTL_GIGA_MAC_VER_27:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4684
			/* Experimental science. Pktgen proof. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4685
			case RTL_GIGA_MAC_VER_12:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4686
			case RTL_GIGA_MAC_VER_25:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4687
				if (status == RxFIFOOver)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4688
					goto done;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4689
				break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4690
			default:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4691
				break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4692
			}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4693
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4694
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4695
		if (unlikely(status & SYSErr)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4696
			rtl8169_pcierr_interrupt(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4697
			break;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4698
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4699
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4700
		if (status & LinkChg)
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4702
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4705
		 * another event which may never come.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4706
		 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4707
		smp_rmb();
4f6670f083f1 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) {
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4710
			tp->intr_mask = ~tp->napi_event;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4711
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4712
			if (likely(napi_schedule_prep(&tp->napi)))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4713
				__napi_schedule(&tp->napi);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4714
			else
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4715
				netif_info(tp, intr, dev,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4716
					   "interrupt %04x in poll\n", status);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4717
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4718
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 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.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4723
		 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4724
		RTL_W16(IntrStatus,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4725
			(status & RxFIFOOver) ? (status | RxOverflow) : status);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4726
		status = RTL_R16(IntrStatus);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4727
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4728
done:
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4729
	return IRQ_RETVAL(handled);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4730
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4731
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4732
static void ec_poll(struct net_device *dev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4733
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4734
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4735
	struct pci_dev *pdev = tp->pci_dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4736
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4737
	rtl8169_interrupt(pdev->irq, dev);
4f6670f083f1 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
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4740
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4741
	if (jiffies - tp->ec_watchdog_jiffies >= 2 * HZ) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4742
		rtl8169_phy_timer((unsigned long) dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4743
		tp->ec_watchdog_jiffies = jiffies;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4744
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4745
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4746
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4748
{
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4750
	struct net_device *dev = tp->dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4751
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4752
	int work_done;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4753
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4755
	rtl8169_tx_interrupt(dev, tp, ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4756
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4757
	if (work_done < budget) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4758
		napi_complete(napi);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4759
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4760
		/* We need for force the visibility of tp->intr_mask
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4761
		 * for other CPUs, as we can loose an MSI interrupt
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4762
		 * and potentially wait for a retransmit timeout if we don't.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4763
		 * The posted write to IntrMask is safe, as it will
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4764
		 * eventually make it to the chip and we won't loose anything
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4765
		 * until it does.
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4766
		 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4767
		tp->intr_mask = 0xffff;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4768
		wmb();
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4769
		RTL_W16(IntrMask, tp->intr_event);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4770
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4771
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4772
	return work_done;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4773
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4774
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4776
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4777
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4778
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4780
		return;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4781
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4783
	RTL_W32(RxMissed, 0);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4784
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4785
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4787
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4788
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4789
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4790
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4791
	rtl8169_delete_timer(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4792
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4793
	if (!tp->ecdev) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4794
		netif_stop_queue(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4795
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4796
		napi_disable(&tp->napi);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4797
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4798
		spin_lock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4799
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4800
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4801
	rtl8169_asic_down(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4802
	/*
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4803
	 * At this point device interrupts can not be enabled in any function,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4804
	 * as netif_running is not true (rtl8169_interrupt, rtl8169_reset_task,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4805
	 * rtl8169_reinit_task) and napi is disabled (rtl8169_poll).
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4806
	 */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4807
	rtl8169_rx_missed(dev, ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4808
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4809
	if (!tp->ecdev) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4810
		spin_unlock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4811
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4812
		synchronize_irq(dev->irq);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4813
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4814
4f6670f083f1 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. */
4f6670f083f1 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()? */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4817
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4818
	rtl8169_tx_clear(tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4819
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4820
	rtl8169_rx_clear(tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4821
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4822
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4824
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4825
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4826
	struct pci_dev *pdev = tp->pci_dev;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4827
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4828
	pm_runtime_get_sync(&pdev->dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4829
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4830
	/* update counters before going down */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4831
	rtl8169_update_counters(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4832
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4833
	rtl8169_down(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4834
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4835
	if (!tp->ecdev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4836
		free_irq(dev->irq, dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4837
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4839
			  tp->RxPhyAddr);
4f6670f083f1 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,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4841
			  tp->TxPhyAddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4842
	tp->TxDescArray = NULL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4843
	tp->RxDescArray = NULL;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4844
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4845
	pm_runtime_put_sync(&pdev->dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4846
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4847
	return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4848
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4849
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4851
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4852
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4853
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4854
	unsigned long flags;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4855
	u32 mc_filter[2];	/* Multicast hash filter */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4856
	int rx_mode;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4857
	u32 tmp = 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4858
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4859
	if (dev->flags & IFF_PROMISC) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4860
		/* Unconditionally log net taps. */
4f6670f083f1 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");
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4862
		rx_mode =
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4863
		    AcceptBroadcast | AcceptMulticast | AcceptMyPhys |
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4864
		    AcceptAllPhys;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4865
		mc_filter[1] = mc_filter[0] = 0xffffffff;
4f6670f083f1 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) ||
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4867
		   (dev->flags & IFF_ALLMULTI)) {
4f6670f083f1 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. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4869
		rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4870
		mc_filter[1] = mc_filter[0] = 0xffffffff;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4871
	} else {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4872
		struct netdev_hw_addr *ha;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4873
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4874
		rx_mode = AcceptBroadcast | AcceptMyPhys;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4875
		mc_filter[1] = mc_filter[0] = 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4876
		netdev_for_each_mc_addr(ha, dev) {
4f6670f083f1 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;
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4879
			rx_mode |= AcceptMulticast;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4880
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4881
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4882
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4883
	spin_lock_irqsave(&tp->lock, flags);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4884
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4885
	tmp = rtl8169_rx_config | rx_mode |
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4887
4f6670f083f1 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) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4889
		u32 data = mc_filter[0];
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4890
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4891
		mc_filter[0] = swab32(mc_filter[1]);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4892
		mc_filter[1] = swab32(data);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4893
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4894
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4895
	RTL_W32(MAR0 + 4, mc_filter[1]);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4896
	RTL_W32(MAR0 + 0, mc_filter[0]);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4897
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4898
	RTL_W32(RxConfig, tmp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4899
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4900
	spin_unlock_irqrestore(&tp->lock, flags);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4901
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4902
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4903
/**
4f6670f083f1 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
4f6670f083f1 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
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4906
 *
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4907
 *  Get TX/RX statistics for rtl8169
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4908
 */
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4910
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4911
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4912
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4913
	unsigned long flags;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4914
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4915
	if (netif_running(dev)) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4916
		spin_lock_irqsave(&tp->lock, flags);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4917
		rtl8169_rx_missed(dev, ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4918
		spin_unlock_irqrestore(&tp->lock, flags);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4919
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4920
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4921
	return &dev->stats;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4922
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4923
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4924
static void rtl8169_net_suspend(struct net_device *dev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4925
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4926
	if (!netif_running(dev))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4927
		return;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4928
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4929
	netif_device_detach(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4930
	netif_stop_queue(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4931
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4932
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4933
#ifdef CONFIG_PM
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4934
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4935
static int rtl8169_suspend(struct device *device)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4936
{
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4939
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4940
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4941
	if (tp->ecdev)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4942
		return -EBUSY;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4943
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4944
	rtl8169_net_suspend(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4945
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4946
	return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4947
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4948
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4950
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4951
	netif_device_attach(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4952
	rtl8169_schedule_work(dev, rtl8169_reset_task);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4953
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4954
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4955
static int rtl8169_resume(struct device *device)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4956
{
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4958
	struct net_device *dev = pci_get_drvdata(pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4959
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4960
2251
5023ce75fe91 Fixed suspend/resume for r8169 drivers.
Florian Pose <fp@igh-essen.com>
parents: 2224
diff changeset
  4961
	if (tp->ecdev)
5023ce75fe91 Fixed suspend/resume for r8169 drivers.
Florian Pose <fp@igh-essen.com>
parents: 2224
diff changeset
  4962
		return -EBUSY;
5023ce75fe91 Fixed suspend/resume for r8169 drivers.
Florian Pose <fp@igh-essen.com>
parents: 2224
diff changeset
  4963
2224
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4964
	rtl8169_init_phy(dev, tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4965
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4966
	if (netif_running(dev))
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4967
		__rtl8169_resume(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4968
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4969
	return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4970
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4971
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4973
{
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4976
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4977
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4978
	if (!tp->TxDescArray)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4979
		return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4980
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4981
	spin_lock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4982
	tp->saved_wolopts = __rtl8169_get_wol(tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4983
	__rtl8169_set_wol(tp, WAKE_ANY);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4984
	spin_unlock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4985
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4986
	rtl8169_net_suspend(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4987
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4988
	return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4989
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4990
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4992
{
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4995
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4996
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4997
	if (!tp->TxDescArray)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4998
		return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4999
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5000
	spin_lock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5001
	__rtl8169_set_wol(tp, tp->saved_wolopts);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5002
	tp->saved_wolopts = 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5003
	spin_unlock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5004
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5005
	rtl8169_init_phy(dev, tp);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5006
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5007
	__rtl8169_resume(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5008
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5009
	return 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5010
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5011
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5013
{
4f6670f083f1 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);
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5016
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5017
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5018
	return tp->TxDescArray ? -EBUSY : 0;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5019
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5020
4f6670f083f1 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 = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5022
	.suspend = rtl8169_suspend,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5023
	.resume = rtl8169_resume,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5024
	.freeze = rtl8169_suspend,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5025
	.thaw = rtl8169_resume,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5026
	.poweroff = rtl8169_suspend,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5027
	.restore = rtl8169_resume,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5028
	.runtime_suspend = rtl8169_runtime_suspend,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5029
	.runtime_resume = rtl8169_runtime_resume,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5030
	.runtime_idle = rtl8169_runtime_idle,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5031
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5032
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5033
#define RTL8169_PM_OPS	(&rtl8169_pm_ops)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5034
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5035
#else /* !CONFIG_PM */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5036
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5037
#define RTL8169_PM_OPS	NULL
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5038
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5039
#endif /* !CONFIG_PM */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5040
4f6670f083f1 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)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5042
{
4f6670f083f1 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);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5044
	struct rtl8169_private *tp = netdev_priv(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5045
	void __iomem *ioaddr = tp->mmio_addr;
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5046
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5047
	rtl8169_net_suspend(dev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5048
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5049
	/* restore original MAC address */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5050
	rtl_rar_set(tp, dev->perm_addr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5051
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5052
	spin_lock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5053
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5054
	rtl8169_asic_down(ioaddr);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5055
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5056
	spin_unlock_irq(&tp->lock);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5057
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5058
	if (system_state == SYSTEM_POWER_OFF) {
4f6670f083f1 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. */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5060
		if (tp->features & RTL_FEATURE_WOL) {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5061
			pci_clear_master(pdev);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5062
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5063
			RTL_W8(ChipCmd, CmdRxEnb);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5064
			/* PCI commit */
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5065
			RTL_R8(ChipCmd);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5066
		}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5067
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5068
		pci_wake_from_d3(pdev, true);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5069
		pci_set_power_state(pdev, PCI_D3hot);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5070
	}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5071
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5072
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5073
static struct pci_driver rtl8169_pci_driver = {
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5074
	.name		= MODULENAME,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5075
	.id_table	= rtl8169_pci_tbl,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5076
	.probe		= rtl8169_init_one,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5077
	.remove		= __devexit_p(rtl8169_remove_one),
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5078
	.shutdown	= rtl_shutdown,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5079
	.driver.pm	= RTL8169_PM_OPS,
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5080
};
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5081
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5082
static int __init rtl8169_init_module(void)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5083
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5084
	return pci_register_driver(&rtl8169_pci_driver);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5085
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5086
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5087
static void __exit rtl8169_cleanup_module(void)
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5088
{
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5089
	pci_unregister_driver(&rtl8169_pci_driver);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5090
}
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5091
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5092
module_init(rtl8169_init_module);
4f6670f083f1 Added r8169 driver for 2.6.37.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5093
module_exit(rtl8169_cleanup_module);