devices/r8169-2.6.35-ethercat.c
author Knud Baastrup <kba@deif.com>
Tue, 14 Apr 2015 13:12:24 -0400
changeset 2629 a2701af27fde
parent 2589 2b9c78543663
permissions -rw-r--r--
Internal SDO requests now synchronized with external requests.
Internal SDO requests are managed by master FSM and can conflict with
external requests managed by slave FSM. The internal SDO requests
includes SDO requests created by an application and external request are
typical created by EtherCAT Tool for SDO upload/download or a directory
fetch initiated with ethercat sdos command. The conflict will cause a
FPWR from an external request to be overwritten by a FPWR from an
internal SDO request (or oppersite) in the same "train" of datagrams.
2277
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/*
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
* r8169.c: RealTek 8169/8168/8101 ethernet driver.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
*
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     4
* Copyright (c) 2002 ShuChen <shuchen@realtek.com.tw>
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     5
* Copyright (c) 2003 - 2007 Francois Romieu <romieu@fr.zoreil.com>
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     6
* Copyright (c) a lot of people too. Please respect their work.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     7
 *
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     8
 * See MAINTAINERS file for support contact information.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     9
 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    10
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    11
#include <linux/module.h>
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    12
#include <linux/moduleparam.h>
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    13
#include <linux/pci.h>
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    14
#include <linux/netdevice.h>
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    15
#include <linux/etherdevice.h>
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    16
#include <linux/delay.h>
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    17
#include <linux/ethtool.h>
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    18
#include <linux/mii.h>
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    19
#include <linux/if_vlan.h>
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
#include <linux/crc32.h>
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
#include <linux/in.h>
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    22
#include <linux/ip.h>
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    23
#include <linux/tcp.h>
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    24
#include <linux/init.h>
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    25
#include <linux/dma-mapping.h>
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    26
#include <linux/pm_runtime.h>
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    27
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
#include <asm/system.h>
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
#include <asm/io.h>
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
#include <asm/irq.h>
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
#include "../globals.h"
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
#include "ecdev.h"
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
#define RTL8169_VERSION "2.3LK-NAPI"
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
#define MODULENAME "ec_r8169"
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
#define PFX MODULENAME ": "
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    37
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    38
#ifdef RTL8169_DEBUG
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
#define assert(expr) \
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
	if (!(expr)) {					\
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
		printk( "Assertion failed! %s,%s,%s,line=%d\n",	\
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
		#expr,__FILE__,__func__,__LINE__);		\
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
#define dprintk(fmt, args...) \
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
	do { printk(KERN_DEBUG PFX fmt, ## args); } while (0)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    46
#else
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    47
#define assert(expr) do {} while (0)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    48
#define dprintk(fmt, args...)	do {} while (0)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    49
#endif /* RTL8169_DEBUG */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    50
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    51
#define R8169_MSG_DEFAULT \
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
	(NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_IFUP | NETIF_MSG_IFDOWN)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    53
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    54
#define TX_BUFFS_AVAIL(tp) \
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    55
	(tp->dirty_tx + NUM_TX_DESC - tp->cur_tx - 1)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    56
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    57
/* Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    58
   The RTL chips use a 64 element hash table based on the Ethernet CRC. */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
static const int multicast_filter_limit = 32;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
/* MAC address length */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
#define MAC_ADDR_LEN	6
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    63
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    64
#define MAX_READ_REQUEST_SHIFT	12
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    65
#define RX_FIFO_THRESH	7	/* 7 means NO threshold, Rx buffer level before first PCI xfer. */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    66
#define RX_DMA_BURST	6	/* Maximum PCI burst, '6' is 1024 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    67
#define TX_DMA_BURST	6	/* Maximum PCI burst, '6' is 1024 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    68
#define EarlyTxThld	0x3F	/* 0x3F means NO early transmit */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    69
#define SafeMtu		0x1c20	/* ... actually life sucks beyond ~7k */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
#define InterFrameGap	0x03	/* 3 means InterFrameGap = the shortest one */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    71
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
#define R8169_REGS_SIZE		256
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    73
#define R8169_NAPI_WEIGHT	64
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    74
#define NUM_TX_DESC	64	/* Number of Tx descriptor registers */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    75
#define NUM_RX_DESC	256	/* Number of Rx descriptor registers */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    76
#define RX_BUF_SIZE	1536	/* Rx Buffer size */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    77
#define R8169_TX_RING_BYTES	(NUM_TX_DESC * sizeof(struct TxDesc))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
#define R8169_RX_RING_BYTES	(NUM_RX_DESC * sizeof(struct RxDesc))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    80
#define RTL8169_TX_TIMEOUT	(6*HZ)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    81
#define RTL8169_PHY_TIMEOUT	(10*HZ)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    82
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    83
#define RTL_EEPROM_SIG		cpu_to_le32(0x8129)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    84
#define RTL_EEPROM_SIG_MASK	cpu_to_le32(0xffff)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    85
#define RTL_EEPROM_SIG_ADDR	0x0000
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    87
/* write/read MMIO register */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    88
#define RTL_W8(reg, val8)	writeb ((val8), ioaddr + (reg))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
#define RTL_W16(reg, val16)	writew ((val16), ioaddr + (reg))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    90
#define RTL_W32(reg, val32)	writel ((val32), ioaddr + (reg))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    91
#define RTL_R8(reg)		readb (ioaddr + (reg))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
#define RTL_R16(reg)		readw (ioaddr + (reg))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    93
#define RTL_R32(reg)		((unsigned long) readl (ioaddr + (reg)))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    94
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    95
enum mac_version {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
	RTL_GIGA_MAC_NONE   = 0x00,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    97
	RTL_GIGA_MAC_VER_01 = 0x01, // 8169
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    98
	RTL_GIGA_MAC_VER_02 = 0x02, // 8169S
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    99
	RTL_GIGA_MAC_VER_03 = 0x03, // 8110S
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   100
	RTL_GIGA_MAC_VER_04 = 0x04, // 8169SB
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   101
	RTL_GIGA_MAC_VER_05 = 0x05, // 8110SCd
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   102
	RTL_GIGA_MAC_VER_06 = 0x06, // 8110SCe
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   103
	RTL_GIGA_MAC_VER_07 = 0x07, // 8102e
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   104
	RTL_GIGA_MAC_VER_08 = 0x08, // 8102e
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   105
	RTL_GIGA_MAC_VER_09 = 0x09, // 8102e
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   106
	RTL_GIGA_MAC_VER_10 = 0x0a, // 8101e
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   107
	RTL_GIGA_MAC_VER_11 = 0x0b, // 8168Bb
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   108
	RTL_GIGA_MAC_VER_12 = 0x0c, // 8168Be
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   109
	RTL_GIGA_MAC_VER_13 = 0x0d, // 8101Eb
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   110
	RTL_GIGA_MAC_VER_14 = 0x0e, // 8101 ?
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   111
	RTL_GIGA_MAC_VER_15 = 0x0f, // 8101 ?
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   112
	RTL_GIGA_MAC_VER_16 = 0x11, // 8101Ec
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   113
	RTL_GIGA_MAC_VER_17 = 0x10, // 8168Bf
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   114
	RTL_GIGA_MAC_VER_18 = 0x12, // 8168CP
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   115
	RTL_GIGA_MAC_VER_19 = 0x13, // 8168C
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
	RTL_GIGA_MAC_VER_20 = 0x14, // 8168C
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
	RTL_GIGA_MAC_VER_21 = 0x15, // 8168C
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   118
	RTL_GIGA_MAC_VER_22 = 0x16, // 8168C
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
	RTL_GIGA_MAC_VER_23 = 0x17, // 8168CP
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
	RTL_GIGA_MAC_VER_24 = 0x18, // 8168CP
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   121
	RTL_GIGA_MAC_VER_25 = 0x19, // 8168D
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
	RTL_GIGA_MAC_VER_26 = 0x1a, // 8168D
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   123
	RTL_GIGA_MAC_VER_27 = 0x1b  // 8168DP
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   124
};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   126
#define _R(NAME,MAC,MASK) \
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   127
	{ .name = NAME, .mac_version = MAC, .RxConfigMask = MASK }
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   128
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   129
static const struct {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   130
	const char *name;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   131
	u8 mac_version;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   132
	u32 RxConfigMask;	/* Clears the bits supported by this chip */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   133
} rtl_chip_info[] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   134
	_R("RTL8169",		RTL_GIGA_MAC_VER_01, 0xff7e1880), // 8169
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   135
	_R("RTL8169s",		RTL_GIGA_MAC_VER_02, 0xff7e1880), // 8169S
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   136
	_R("RTL8110s",		RTL_GIGA_MAC_VER_03, 0xff7e1880), // 8110S
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   137
	_R("RTL8169sb/8110sb",	RTL_GIGA_MAC_VER_04, 0xff7e1880), // 8169SB
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   138
	_R("RTL8169sc/8110sc",	RTL_GIGA_MAC_VER_05, 0xff7e1880), // 8110SCd
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   139
	_R("RTL8169sc/8110sc",	RTL_GIGA_MAC_VER_06, 0xff7e1880), // 8110SCe
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   140
	_R("RTL8102e",		RTL_GIGA_MAC_VER_07, 0xff7e1880), // PCI-E
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   141
	_R("RTL8102e",		RTL_GIGA_MAC_VER_08, 0xff7e1880), // PCI-E
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   142
	_R("RTL8102e",		RTL_GIGA_MAC_VER_09, 0xff7e1880), // PCI-E
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   143
	_R("RTL8101e",		RTL_GIGA_MAC_VER_10, 0xff7e1880), // PCI-E
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   144
	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_11, 0xff7e1880), // PCI-E
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   145
	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_12, 0xff7e1880), // PCI-E
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   146
	_R("RTL8101e",		RTL_GIGA_MAC_VER_13, 0xff7e1880), // PCI-E 8139
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   147
	_R("RTL8100e",		RTL_GIGA_MAC_VER_14, 0xff7e1880), // PCI-E 8139
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   148
	_R("RTL8100e",		RTL_GIGA_MAC_VER_15, 0xff7e1880), // PCI-E 8139
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   149
	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_17, 0xff7e1880), // PCI-E
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   150
	_R("RTL8101e",		RTL_GIGA_MAC_VER_16, 0xff7e1880), // PCI-E
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   151
	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_18, 0xff7e1880), // PCI-E
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   152
	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_19, 0xff7e1880), // PCI-E
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   153
	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_20, 0xff7e1880), // PCI-E
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   154
	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_21, 0xff7e1880), // PCI-E
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   155
	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_22, 0xff7e1880), // PCI-E
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   156
	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_23, 0xff7e1880), // PCI-E
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   157
	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_24, 0xff7e1880), // PCI-E
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   158
	_R("RTL8168d/8111d",	RTL_GIGA_MAC_VER_25, 0xff7e1880), // PCI-E
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   159
	_R("RTL8168d/8111d",	RTL_GIGA_MAC_VER_26, 0xff7e1880), // PCI-E
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   160
	_R("RTL8168dp/8111dp",	RTL_GIGA_MAC_VER_27, 0xff7e1880)  // PCI-E
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   161
};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   162
#undef _R
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   163
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   164
enum cfg_version {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   165
	RTL_CFG_0 = 0x00,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
	RTL_CFG_1,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   167
	RTL_CFG_2
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   169
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   170
static void rtl_hw_start_8169(struct net_device *);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   171
static void rtl_hw_start_8168(struct net_device *);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   172
static void rtl_hw_start_8101(struct net_device *);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   173
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   174
static DEFINE_PCI_DEVICE_TABLE(rtl8169_pci_tbl) = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   175
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8129), 0, 0, RTL_CFG_0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   176
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8136), 0, 0, RTL_CFG_2 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   177
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8167), 0, 0, RTL_CFG_0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   178
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8168), 0, 0, RTL_CFG_1 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   179
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8169), 0, 0, RTL_CFG_0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   180
	{ PCI_DEVICE(PCI_VENDOR_ID_DLINK,	0x4300), 0, 0, RTL_CFG_0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   181
	{ PCI_DEVICE(PCI_VENDOR_ID_AT,		0xc107), 0, 0, RTL_CFG_0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   182
	{ PCI_DEVICE(0x16ec,			0x0116), 0, 0, RTL_CFG_0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   183
	{ PCI_VENDOR_ID_LINKSYS,		0x1032,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   184
		PCI_ANY_ID, 0x0024, 0, 0, RTL_CFG_0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   185
	{ 0x0001,				0x8168,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
		PCI_ANY_ID, 0x2410, 0, 0, RTL_CFG_2 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   187
	{0,},
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   188
};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   189
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   190
/* prevent driver from being loaded automatically */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   191
//MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   192
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
/*
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   194
 * we set our copybreak very high so that we don't have
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   195
 * to allocate 16k frames all the time (see note in
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
 * rtl8169_open()
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   198
static int rx_copybreak = 16383;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
static int use_dac;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   200
static struct {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   201
	u32 msg_enable;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   202
} debug = { -1 };
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   203
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   204
enum rtl_registers {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   205
	MAC0		= 0,	/* Ethernet hardware address. */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   206
	MAC4		= 4,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   207
	MAR0		= 8,	/* Multicast filter. */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   208
	CounterAddrLow		= 0x10,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   209
	CounterAddrHigh		= 0x14,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   210
	TxDescStartAddrLow	= 0x20,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   211
	TxDescStartAddrHigh	= 0x24,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   212
	TxHDescStartAddrLow	= 0x28,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   213
	TxHDescStartAddrHigh	= 0x2c,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   214
	FLASH		= 0x30,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   215
	ERSR		= 0x36,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   216
	ChipCmd		= 0x37,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   217
	TxPoll		= 0x38,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   218
	IntrMask	= 0x3c,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   219
	IntrStatus	= 0x3e,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   220
	TxConfig	= 0x40,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   221
	RxConfig	= 0x44,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   222
	RxMissed	= 0x4c,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   223
	Cfg9346		= 0x50,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   224
	Config0		= 0x51,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   225
	Config1		= 0x52,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   226
	Config2		= 0x53,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   227
	Config3		= 0x54,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   228
	Config4		= 0x55,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   229
	Config5		= 0x56,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   230
	MultiIntr	= 0x5c,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   231
	PHYAR		= 0x60,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   232
	PHYstatus	= 0x6c,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   233
	RxMaxSize	= 0xda,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   234
	CPlusCmd	= 0xe0,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   235
	IntrMitigate	= 0xe2,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   236
	RxDescAddrLow	= 0xe4,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   237
	RxDescAddrHigh	= 0xe8,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   238
	EarlyTxThres	= 0xec,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   239
	FuncEvent	= 0xf0,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   240
	FuncEventMask	= 0xf4,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   241
	FuncPresetState	= 0xf8,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   242
	FuncForceEvent	= 0xfc,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   243
};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   244
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   245
enum rtl8110_registers {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   246
	TBICSR			= 0x64,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   247
	TBI_ANAR		= 0x68,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   248
	TBI_LPAR		= 0x6a,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   250
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   251
enum rtl8168_8101_registers {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   252
	CSIDR			= 0x64,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   253
	CSIAR			= 0x68,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   254
#define	CSIAR_FLAG			0x80000000
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   255
#define	CSIAR_WRITE_CMD			0x80000000
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   256
#define	CSIAR_BYTE_ENABLE		0x0f
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   257
#define	CSIAR_BYTE_ENABLE_SHIFT		12
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   258
#define	CSIAR_ADDR_MASK			0x0fff
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   259
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   260
	EPHYAR			= 0x80,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
#define	EPHYAR_FLAG			0x80000000
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
#define	EPHYAR_WRITE_CMD		0x80000000
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
#define	EPHYAR_REG_MASK			0x1f
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   264
#define	EPHYAR_REG_SHIFT		16
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   265
#define	EPHYAR_DATA_MASK		0xffff
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   266
	DBG_REG			= 0xd1,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   267
#define	FIX_NAK_1			(1 << 4)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   268
#define	FIX_NAK_2			(1 << 3)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   269
	EFUSEAR			= 0xdc,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   270
#define	EFUSEAR_FLAG			0x80000000
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   271
#define	EFUSEAR_WRITE_CMD		0x80000000
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   272
#define	EFUSEAR_READ_CMD		0x00000000
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   273
#define	EFUSEAR_REG_MASK		0x03ff
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
#define	EFUSEAR_REG_SHIFT		8
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   275
#define	EFUSEAR_DATA_MASK		0xff
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   276
};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
enum rtl_register_content {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
	/* InterruptStatusBits */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   280
	SYSErr		= 0x8000,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   281
	PCSTimeout	= 0x4000,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   282
	SWInt		= 0x0100,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   283
	TxDescUnavail	= 0x0080,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   284
	RxFIFOOver	= 0x0040,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   285
	LinkChg		= 0x0020,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   286
	RxOverflow	= 0x0010,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   287
	TxErr		= 0x0008,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   288
	TxOK		= 0x0004,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   289
	RxErr		= 0x0002,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   290
	RxOK		= 0x0001,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   291
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   292
	/* RxStatusDesc */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   293
	RxFOVF	= (1 << 23),
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   294
	RxRWT	= (1 << 22),
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   295
	RxRES	= (1 << 21),
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   296
	RxRUNT	= (1 << 20),
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   297
	RxCRC	= (1 << 19),
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   298
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   299
	/* ChipCmdBits */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   300
	CmdReset	= 0x10,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   301
	CmdRxEnb	= 0x08,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   302
	CmdTxEnb	= 0x04,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   303
	RxBufEmpty	= 0x01,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   304
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   305
	/* TXPoll register p.5 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   306
	HPQ		= 0x80,		/* Poll cmd on the high prio queue */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   307
	NPQ		= 0x40,		/* Poll cmd on the low prio queue */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   308
	FSWInt		= 0x01,		/* Forced software interrupt */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   309
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   310
	/* Cfg9346Bits */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   311
	Cfg9346_Lock	= 0x00,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   312
	Cfg9346_Unlock	= 0xc0,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   313
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   314
	/* rx_mode_bits */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   315
	AcceptErr	= 0x20,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   316
	AcceptRunt	= 0x10,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   317
	AcceptBroadcast	= 0x08,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   318
	AcceptMulticast	= 0x04,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   319
	AcceptMyPhys	= 0x02,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   320
	AcceptAllPhys	= 0x01,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   321
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   322
	/* RxConfigBits */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   323
	RxCfgFIFOShift	= 13,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   324
	RxCfgDMAShift	=  8,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   325
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   326
	/* TxConfigBits */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   327
	TxInterFrameGapShift = 24,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   328
	TxDMAShift = 8,	/* DMA burst value (0-7) is shift this many bits */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   329
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   330
	/* Config1 register p.24 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   331
	LEDS1		= (1 << 7),
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   332
	LEDS0		= (1 << 6),
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   333
	MSIEnable	= (1 << 5),	/* Enable Message Signaled Interrupt */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   334
	Speed_down	= (1 << 4),
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   335
	MEMMAP		= (1 << 3),
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   336
	IOMAP		= (1 << 2),
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   337
	VPD		= (1 << 1),
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   338
	PMEnable	= (1 << 0),	/* Power Management Enable */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   339
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   340
	/* Config2 register p. 25 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   341
	PCI_Clock_66MHz = 0x01,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   342
	PCI_Clock_33MHz = 0x00,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   343
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   344
	/* Config3 register p.25 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   345
	MagicPacket	= (1 << 5),	/* Wake up when receives a Magic Packet */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   346
	LinkUp		= (1 << 4),	/* Wake up when the cable connection is re-established */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   347
	Beacon_en	= (1 << 0),	/* 8168 only. Reserved in the 8168b */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   348
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   349
	/* Config5 register p.27 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   350
	BWF		= (1 << 6),	/* Accept Broadcast wakeup frame */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
	MWF		= (1 << 5),	/* Accept Multicast wakeup frame */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   352
	UWF		= (1 << 4),	/* Accept Unicast wakeup frame */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   353
	LanWake		= (1 << 1),	/* LanWake enable/disable */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   354
	PMEStatus	= (1 << 0),	/* PME status can be reset by PCI RST# */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   355
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
	/* TBICSR p.28 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
	TBIReset	= 0x80000000,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   358
	TBILoopback	= 0x40000000,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
	TBINwEnable	= 0x20000000,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
	TBINwRestart	= 0x10000000,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   361
	TBILinkOk	= 0x02000000,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
	TBINwComplete	= 0x01000000,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   363
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
	/* CPlusCmd p.31 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   365
	EnableBist	= (1 << 15),	// 8168 8101
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   366
	Mac_dbgo_oe	= (1 << 14),	// 8168 8101
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   367
	Normal_mode	= (1 << 13),	// unused
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   368
	Force_half_dup	= (1 << 12),	// 8168 8101
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   369
	Force_rxflow_en	= (1 << 11),	// 8168 8101
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
	Force_txflow_en	= (1 << 10),	// 8168 8101
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   371
	Cxpl_dbg_sel	= (1 << 9),	// 8168 8101
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
	ASF		= (1 << 8),	// 8168 8101
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
	PktCntrDisable	= (1 << 7),	// 8168 8101
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   374
	Mac_dbgo_sel	= 0x001c,	// 8168
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   375
	RxVlan		= (1 << 6),
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
	RxChkSum	= (1 << 5),
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
	PCIDAC		= (1 << 4),
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   378
	PCIMulRW	= (1 << 3),
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   379
	INTT_0		= 0x0000,	// 8168
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
	INTT_1		= 0x0001,	// 8168
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
	INTT_2		= 0x0002,	// 8168
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   382
	INTT_3		= 0x0003,	// 8168
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   383
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   384
	/* rtl8169_PHYstatus */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   385
	TBI_Enable	= 0x80,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   386
	TxFlowCtrl	= 0x40,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   387
	RxFlowCtrl	= 0x20,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   388
	_1000bpsF	= 0x10,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   389
	_100bps		= 0x08,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   390
	_10bps		= 0x04,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
	LinkStatus	= 0x02,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   392
	FullDup		= 0x01,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   393
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   394
	/* _TBICSRBit */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   395
	TBILinkOK	= 0x02000000,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   396
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   397
	/* DumpCounterCommand */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   398
	CounterDump	= 0x8,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   400
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   401
enum desc_status_bit {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   402
	DescOwn		= (1 << 31), /* Descriptor is owned by NIC */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   403
	RingEnd		= (1 << 30), /* End of descriptor ring */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   404
	FirstFrag	= (1 << 29), /* First segment of a packet */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
	LastFrag	= (1 << 28), /* Final segment of a packet */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   406
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   407
	/* Tx private */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   408
	LargeSend	= (1 << 27), /* TCP Large Send Offload (TSO) */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   409
	MSSShift	= 16,        /* MSS value position */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   410
	MSSMask		= 0xfff,     /* MSS value + LargeSend bit: 12 bits */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   411
	IPCS		= (1 << 18), /* Calculate IP checksum */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   412
	UDPCS		= (1 << 17), /* Calculate UDP/IP checksum */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   413
	TCPCS		= (1 << 16), /* Calculate TCP/IP checksum */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   414
	TxVlanTag	= (1 << 17), /* Add VLAN tag */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   415
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   416
	/* Rx private */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   417
	PID1		= (1 << 18), /* Protocol ID bit 1/2 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   418
	PID0		= (1 << 17), /* Protocol ID bit 2/2 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   419
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   420
#define RxProtoUDP	(PID1)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   421
#define RxProtoTCP	(PID0)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   422
#define RxProtoIP	(PID1 | PID0)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   423
#define RxProtoMask	RxProtoIP
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   424
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   425
	IPFail		= (1 << 16), /* IP checksum failed */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   426
	UDPFail		= (1 << 15), /* UDP/IP checksum failed */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   427
	TCPFail		= (1 << 14), /* TCP/IP checksum failed */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   428
	RxVlanTag	= (1 << 16), /* VLAN tag available */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   429
};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   430
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   431
#define RsvdMask	0x3fffc000
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   432
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   433
struct TxDesc {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   434
	__le32 opts1;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   435
	__le32 opts2;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   436
	__le64 addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   437
};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   438
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   439
struct RxDesc {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   440
	__le32 opts1;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   441
	__le32 opts2;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   442
	__le64 addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   443
};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   444
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   445
struct ring_info {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   446
	struct sk_buff	*skb;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   447
	u32		len;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   448
	u8		__pad[sizeof(void *) - sizeof(u32)];
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   449
};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   450
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   451
enum features {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   452
	RTL_FEATURE_WOL		= (1 << 0),
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   453
	RTL_FEATURE_MSI		= (1 << 1),
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   454
	RTL_FEATURE_GMII	= (1 << 2),
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   455
};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   456
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   457
struct rtl8169_counters {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   458
	__le64	tx_packets;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
	__le64	rx_packets;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   460
	__le64	tx_errors;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   461
	__le32	rx_errors;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   462
	__le16	rx_missed;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   463
	__le16	align_errors;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   464
	__le32	tx_one_collision;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   465
	__le32	tx_multi_collision;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   466
	__le64	rx_unicast;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   467
	__le64	rx_broadcast;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   468
	__le32	rx_multicast;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   469
	__le16	tx_aborted;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   470
	__le16	tx_underun;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   471
};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   472
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   473
struct rtl8169_private {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   474
	void __iomem *mmio_addr;	/* memory map physical address */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   475
	struct pci_dev *pci_dev;	/* Index of PCI device */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   476
	struct net_device *dev;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   477
	struct napi_struct napi;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   478
	spinlock_t lock;		/* spin lock flag */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   479
	u32 msg_enable;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   480
	int chipset;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   481
	int mac_version;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   482
	u32 cur_rx; /* Index into the Rx descriptor buffer of next Rx pkt. */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   483
	u32 cur_tx; /* Index into the Tx descriptor buffer of next Rx pkt. */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   484
	u32 dirty_rx;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   485
	u32 dirty_tx;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   486
	struct TxDesc *TxDescArray;	/* 256-aligned Tx descriptor ring */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   487
	struct RxDesc *RxDescArray;	/* 256-aligned Rx descriptor ring */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   488
	dma_addr_t TxPhyAddr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   489
	dma_addr_t RxPhyAddr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   490
	struct sk_buff *Rx_skbuff[NUM_RX_DESC];	/* Rx data buffers */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   491
	struct ring_info tx_skb[NUM_TX_DESC];	/* Tx data buffers */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   492
	unsigned align;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   493
	unsigned rx_buf_sz;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   494
	struct timer_list timer;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   495
	u16 cp_cmd;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   496
	u16 intr_event;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   497
	u16 napi_event;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   498
	u16 intr_mask;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   499
	int phy_1000_ctrl_reg;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   500
#ifdef CONFIG_R8169_VLAN
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   501
	struct vlan_group *vlgrp;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   502
#endif
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   503
	int (*set_speed)(struct net_device *, u8 autoneg, u16 speed, u8 duplex);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   504
	int (*get_settings)(struct net_device *, struct ethtool_cmd *);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   505
	void (*phy_reset_enable)(void __iomem *);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   506
	void (*hw_start)(struct net_device *);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   507
	unsigned int (*phy_reset_pending)(void __iomem *);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   508
	unsigned int (*link_ok)(void __iomem *);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   509
	int (*do_ioctl)(struct rtl8169_private *tp, struct mii_ioctl_data *data, int cmd);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   510
	int pcie_cap;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   511
	struct delayed_work task;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   512
	unsigned features;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   513
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   514
	struct mii_if_info mii;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   515
	struct rtl8169_counters counters;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   516
	u32 saved_wolopts;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   517
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   518
	ec_device_t *ecdev;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   519
	unsigned long ec_watchdog_jiffies;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   520
};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   521
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   522
MODULE_AUTHOR("Realtek and the Linux r8169 crew <netdev@vger.kernel.org>");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   523
MODULE_DESCRIPTION("RealTek RTL-8169 Gigabit Ethernet driver (EtherCAT)");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   524
module_param(rx_copybreak, int, 0);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   525
MODULE_PARM_DESC(rx_copybreak, "Copy breakpoint for copy-only-tiny-frames");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   526
module_param(use_dac, int, 0);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   527
MODULE_PARM_DESC(use_dac, "Enable PCI DAC. Unsafe on 32 bit PCI slot.");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   528
module_param_named(debug, debug.msg_enable, int, 0);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   529
MODULE_PARM_DESC(debug, "Debug verbosity level (0=none, ..., 16=all)");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   530
MODULE_LICENSE("GPL");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   531
MODULE_VERSION(EC_MASTER_VERSION);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   532
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   533
static int rtl8169_open(struct net_device *dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   534
static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   535
				      struct net_device *dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   536
static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   537
static int rtl8169_init_ring(struct net_device *dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   538
static void rtl_hw_start(struct net_device *dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   539
static int rtl8169_close(struct net_device *dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   540
static void rtl_set_rx_mode(struct net_device *dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   541
static void rtl8169_tx_timeout(struct net_device *dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   542
static struct net_device_stats *rtl8169_get_stats(struct net_device *dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   543
static int rtl8169_rx_interrupt(struct net_device *, struct rtl8169_private *,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   544
				void __iomem *, u32 budget);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   545
static int rtl8169_change_mtu(struct net_device *dev, int new_mtu);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   546
static void rtl8169_down(struct net_device *dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   547
static void rtl8169_rx_clear(struct rtl8169_private *tp);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   548
static void ec_poll(struct net_device *dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   549
static int rtl8169_poll(struct napi_struct *napi, int budget);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   550
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   551
static const unsigned int rtl8169_rx_config =
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   552
	(RX_FIFO_THRESH << RxCfgFIFOShift) | (RX_DMA_BURST << RxCfgDMAShift);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   553
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   554
static void mdio_write(void __iomem *ioaddr, int reg_addr, int value)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   555
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   556
	int i;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   557
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   558
	RTL_W32(PHYAR, 0x80000000 | (reg_addr & 0x1f) << 16 | (value & 0xffff));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   559
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   560
	for (i = 20; i > 0; i--) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   561
		/*
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   562
		 * Check if the RTL8169 has completed writing to the specified
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   563
		 * MII register.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   564
		 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   565
		if (!(RTL_R32(PHYAR) & 0x80000000))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   566
			break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   567
		udelay(25);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   568
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   569
	/*
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   570
	 * According to hardware specs a 20us delay is required after write
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   571
	 * complete indication, but before sending next command.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   572
	 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   573
	udelay(20);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   574
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   575
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   576
static int mdio_read(void __iomem *ioaddr, int reg_addr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   577
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   578
	int i, value = -1;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   579
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   580
	RTL_W32(PHYAR, 0x0 | (reg_addr & 0x1f) << 16);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   581
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   582
	for (i = 20; i > 0; i--) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   583
		/*
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   584
		 * Check if the RTL8169 has completed retrieving data from
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   585
		 * the specified MII register.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   586
		 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   587
		if (RTL_R32(PHYAR) & 0x80000000) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   588
			value = RTL_R32(PHYAR) & 0xffff;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   589
			break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   590
		}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   591
		udelay(25);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   592
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   593
	/*
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   594
	 * According to hardware specs a 20us delay is required after read
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   595
	 * complete indication, but before sending next command.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   596
	 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   597
	udelay(20);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   598
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   599
	return value;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   600
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   601
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   602
static void mdio_patch(void __iomem *ioaddr, int reg_addr, int value)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   603
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   604
	mdio_write(ioaddr, reg_addr, mdio_read(ioaddr, reg_addr) | value);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   605
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   606
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   607
static void mdio_plus_minus(void __iomem *ioaddr, int reg_addr, int p, int m)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   608
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   609
	int val;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   610
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   611
	val = mdio_read(ioaddr, reg_addr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   612
	mdio_write(ioaddr, reg_addr, (val | p) & ~m);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   613
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   614
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   615
static void rtl_mdio_write(struct net_device *dev, int phy_id, int location,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   616
			   int val)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   617
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   618
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   619
	void __iomem *ioaddr = tp->mmio_addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   620
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   621
	mdio_write(ioaddr, location, val);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   622
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   623
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   624
static int rtl_mdio_read(struct net_device *dev, int phy_id, int location)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   625
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   626
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   627
	void __iomem *ioaddr = tp->mmio_addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   628
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   629
	return mdio_read(ioaddr, location);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   630
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   631
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   632
static void rtl_ephy_write(void __iomem *ioaddr, int reg_addr, int value)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   633
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   634
	unsigned int i;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   635
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   636
	RTL_W32(EPHYAR, EPHYAR_WRITE_CMD | (value & EPHYAR_DATA_MASK) |
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   637
		(reg_addr & EPHYAR_REG_MASK) << EPHYAR_REG_SHIFT);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   638
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   639
	for (i = 0; i < 100; i++) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   640
		if (!(RTL_R32(EPHYAR) & EPHYAR_FLAG))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   641
			break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   642
		udelay(10);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   643
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   644
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   645
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   646
static u16 rtl_ephy_read(void __iomem *ioaddr, int reg_addr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   647
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   648
	u16 value = 0xffff;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   649
	unsigned int i;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   650
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   651
	RTL_W32(EPHYAR, (reg_addr & EPHYAR_REG_MASK) << EPHYAR_REG_SHIFT);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   652
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   653
	for (i = 0; i < 100; i++) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   654
		if (RTL_R32(EPHYAR) & EPHYAR_FLAG) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   655
			value = RTL_R32(EPHYAR) & EPHYAR_DATA_MASK;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   656
			break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   657
		}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   658
		udelay(10);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   659
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   660
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   661
	return value;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   662
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   663
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   664
static void rtl_csi_write(void __iomem *ioaddr, int addr, int value)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   665
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   666
	unsigned int i;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   667
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   668
	RTL_W32(CSIDR, value);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   669
	RTL_W32(CSIAR, CSIAR_WRITE_CMD | (addr & CSIAR_ADDR_MASK) |
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   670
		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   671
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   672
	for (i = 0; i < 100; i++) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   673
		if (!(RTL_R32(CSIAR) & CSIAR_FLAG))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   674
			break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   675
		udelay(10);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   676
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   677
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   678
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   679
static u32 rtl_csi_read(void __iomem *ioaddr, int addr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   680
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   681
	u32 value = ~0x00;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   682
	unsigned int i;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   683
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   684
	RTL_W32(CSIAR, (addr & CSIAR_ADDR_MASK) |
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   685
		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   686
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   687
	for (i = 0; i < 100; i++) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   688
		if (RTL_R32(CSIAR) & CSIAR_FLAG) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   689
			value = RTL_R32(CSIDR);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   690
			break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   691
		}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   692
		udelay(10);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   693
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   694
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   695
	return value;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   696
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   697
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   698
static u8 rtl8168d_efuse_read(void __iomem *ioaddr, int reg_addr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   699
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   700
	u8 value = 0xff;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   701
	unsigned int i;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   702
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   703
	RTL_W32(EFUSEAR, (reg_addr & EFUSEAR_REG_MASK) << EFUSEAR_REG_SHIFT);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   704
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   705
	for (i = 0; i < 300; i++) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   706
		if (RTL_R32(EFUSEAR) & EFUSEAR_FLAG) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   707
			value = RTL_R32(EFUSEAR) & EFUSEAR_DATA_MASK;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   708
			break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   709
		}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   710
		udelay(100);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   711
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   712
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   713
	return value;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   714
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   715
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   716
static void rtl8169_irq_mask_and_ack(void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   717
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   718
	RTL_W16(IntrMask, 0x0000);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   719
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   720
	RTL_W16(IntrStatus, 0xffff);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   721
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   722
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   723
static void rtl8169_asic_down(void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   724
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   725
	RTL_W8(ChipCmd, 0x00);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   726
	rtl8169_irq_mask_and_ack(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   727
	RTL_R16(CPlusCmd);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   728
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   729
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   730
static unsigned int rtl8169_tbi_reset_pending(void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   731
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   732
	return RTL_R32(TBICSR) & TBIReset;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   733
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   734
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   735
static unsigned int rtl8169_xmii_reset_pending(void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   736
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   737
	return mdio_read(ioaddr, MII_BMCR) & BMCR_RESET;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   738
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   739
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   740
static unsigned int rtl8169_tbi_link_ok(void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   741
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   742
	return RTL_R32(TBICSR) & TBILinkOk;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   743
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   744
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   745
static unsigned int rtl8169_xmii_link_ok(void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   746
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   747
	return RTL_R8(PHYstatus) & LinkStatus;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   748
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   749
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   750
static void rtl8169_tbi_reset_enable(void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   751
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   752
	RTL_W32(TBICSR, RTL_R32(TBICSR) | TBIReset);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   753
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   754
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   755
static void rtl8169_xmii_reset_enable(void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   756
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   757
	unsigned int val;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   758
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   759
	val = mdio_read(ioaddr, MII_BMCR) | BMCR_RESET;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   760
	mdio_write(ioaddr, MII_BMCR, val & 0xffff);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   761
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   762
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   763
static void rtl8169_check_link_status(struct net_device *dev,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   764
				      struct rtl8169_private *tp,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   765
				      void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   766
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   767
	unsigned long flags;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   768
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   769
	if (tp->ecdev) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   770
		ecdev_set_link(tp->ecdev, tp->link_ok(ioaddr) ? 1 : 0);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   771
		return;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   772
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   773
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   774
	spin_lock_irqsave(&tp->lock, flags);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   775
	if (tp->link_ok(ioaddr)) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   776
		/* This is to cancel a scheduled suspend if there's one. */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   777
		pm_request_resume(&tp->pci_dev->dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   778
		netif_carrier_on(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   779
		netif_info(tp, ifup, dev, "link up\n");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   780
	} else {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   781
		netif_carrier_off(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   782
		netif_info(tp, ifdown, dev, "link down\n");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   783
		pm_schedule_suspend(&tp->pci_dev->dev, 100);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   784
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   785
	spin_unlock_irqrestore(&tp->lock, flags);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   786
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   787
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   788
#define WAKE_ANY (WAKE_PHY | WAKE_MAGIC | WAKE_UCAST | WAKE_BCAST | WAKE_MCAST)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   789
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   790
static u32 __rtl8169_get_wol(struct rtl8169_private *tp)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   791
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   792
	void __iomem *ioaddr = tp->mmio_addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   793
	u8 options;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   794
	u32 wolopts = 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   795
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   796
	options = RTL_R8(Config1);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   797
	if (!(options & PMEnable))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   798
		return 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   799
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   800
	options = RTL_R8(Config3);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   801
	if (options & LinkUp)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   802
		wolopts |= WAKE_PHY;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   803
	if (options & MagicPacket)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   804
		wolopts |= WAKE_MAGIC;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   805
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   806
	options = RTL_R8(Config5);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   807
	if (options & UWF)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   808
		wolopts |= WAKE_UCAST;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   809
	if (options & BWF)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   810
		wolopts |= WAKE_BCAST;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   811
	if (options & MWF)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   812
		wolopts |= WAKE_MCAST;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   813
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   814
	return wolopts;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   815
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   816
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   817
static void rtl8169_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   818
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   819
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   820
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   821
	spin_lock_irq(&tp->lock);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   822
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   823
	wol->supported = WAKE_ANY;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   824
	wol->wolopts = __rtl8169_get_wol(tp);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   825
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   826
	spin_unlock_irq(&tp->lock);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   827
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   828
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   829
static void __rtl8169_set_wol(struct rtl8169_private *tp, u32 wolopts)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   830
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   831
	void __iomem *ioaddr = tp->mmio_addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   832
	unsigned int i;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   833
	static const struct {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   834
		u32 opt;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   835
		u16 reg;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   836
		u8  mask;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   837
	} cfg[] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   838
		{ WAKE_ANY,   Config1, PMEnable },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   839
		{ WAKE_PHY,   Config3, LinkUp },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   840
		{ WAKE_MAGIC, Config3, MagicPacket },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   841
		{ WAKE_UCAST, Config5, UWF },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   842
		{ WAKE_BCAST, Config5, BWF },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   843
		{ WAKE_MCAST, Config5, MWF },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   844
		{ WAKE_ANY,   Config5, LanWake }
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   845
	};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   846
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   847
	RTL_W8(Cfg9346, Cfg9346_Unlock);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   848
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   849
	for (i = 0; i < ARRAY_SIZE(cfg); i++) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   850
		u8 options = RTL_R8(cfg[i].reg) & ~cfg[i].mask;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   851
		if (wolopts & cfg[i].opt)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   852
			options |= cfg[i].mask;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   853
		RTL_W8(cfg[i].reg, options);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   854
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   855
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   856
	RTL_W8(Cfg9346, Cfg9346_Lock);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   857
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   858
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   859
static int rtl8169_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   860
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   861
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   862
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   863
	spin_lock_irq(&tp->lock);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   864
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   865
	if (wol->wolopts)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   866
		tp->features |= RTL_FEATURE_WOL;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   867
	else
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   868
		tp->features &= ~RTL_FEATURE_WOL;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   869
	__rtl8169_set_wol(tp, wol->wolopts);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   870
	device_set_wakeup_enable(&tp->pci_dev->dev, wol->wolopts);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   871
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   872
	spin_unlock_irq(&tp->lock);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   873
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   874
	return 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   875
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   876
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   877
static void rtl8169_get_drvinfo(struct net_device *dev,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   878
				struct ethtool_drvinfo *info)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   879
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   880
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   881
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   882
	strcpy(info->driver, MODULENAME);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   883
	strcpy(info->version, RTL8169_VERSION);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   884
	strcpy(info->bus_info, pci_name(tp->pci_dev));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   885
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   886
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   887
static int rtl8169_get_regs_len(struct net_device *dev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   888
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   889
	return R8169_REGS_SIZE;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   890
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   891
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   892
static int rtl8169_set_speed_tbi(struct net_device *dev,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   893
				 u8 autoneg, u16 speed, u8 duplex)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   894
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   895
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   896
	void __iomem *ioaddr = tp->mmio_addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   897
	int ret = 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   898
	u32 reg;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   899
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   900
	reg = RTL_R32(TBICSR);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   901
	if ((autoneg == AUTONEG_DISABLE) && (speed == SPEED_1000) &&
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   902
	    (duplex == DUPLEX_FULL)) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   903
		RTL_W32(TBICSR, reg & ~(TBINwEnable | TBINwRestart));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   904
	} else if (autoneg == AUTONEG_ENABLE)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   905
		RTL_W32(TBICSR, reg | TBINwEnable | TBINwRestart);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   906
	else {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   907
		netif_warn(tp, link, dev,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   908
			   "incorrect speed setting refused in TBI mode\n");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   909
		ret = -EOPNOTSUPP;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   910
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   911
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   912
	return ret;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   913
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   914
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   915
static int rtl8169_set_speed_xmii(struct net_device *dev,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   916
				  u8 autoneg, u16 speed, u8 duplex)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   917
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   918
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   919
	void __iomem *ioaddr = tp->mmio_addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   920
	int giga_ctrl, bmcr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   921
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   922
	if (autoneg == AUTONEG_ENABLE) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   923
		int auto_nego;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   924
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   925
		auto_nego = mdio_read(ioaddr, MII_ADVERTISE);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   926
		auto_nego |= (ADVERTISE_10HALF | ADVERTISE_10FULL |
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   927
			      ADVERTISE_100HALF | ADVERTISE_100FULL);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   928
		auto_nego |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   929
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   930
		giga_ctrl = mdio_read(ioaddr, MII_CTRL1000);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   931
		giga_ctrl &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   932
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   933
		/* The 8100e/8101e/8102e do Fast Ethernet only. */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   934
		if ((tp->mac_version != RTL_GIGA_MAC_VER_07) &&
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   935
		    (tp->mac_version != RTL_GIGA_MAC_VER_08) &&
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   936
		    (tp->mac_version != RTL_GIGA_MAC_VER_09) &&
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   937
		    (tp->mac_version != RTL_GIGA_MAC_VER_10) &&
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   938
		    (tp->mac_version != RTL_GIGA_MAC_VER_13) &&
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   939
		    (tp->mac_version != RTL_GIGA_MAC_VER_14) &&
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   940
		    (tp->mac_version != RTL_GIGA_MAC_VER_15) &&
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   941
		    (tp->mac_version != RTL_GIGA_MAC_VER_16)) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   942
			giga_ctrl |= ADVERTISE_1000FULL | ADVERTISE_1000HALF;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   943
		} else {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   944
			netif_info(tp, link, dev,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   945
				   "PHY does not support 1000Mbps\n");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   946
		}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   947
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   948
		bmcr = BMCR_ANENABLE | BMCR_ANRESTART;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   949
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   950
		if ((tp->mac_version == RTL_GIGA_MAC_VER_11) ||
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   951
		    (tp->mac_version == RTL_GIGA_MAC_VER_12) ||
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   952
		    (tp->mac_version >= RTL_GIGA_MAC_VER_17)) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   953
			/*
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   954
			 * Wake up the PHY.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   955
			 * Vendor specific (0x1f) and reserved (0x0e) MII
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   956
			 * registers.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   957
			 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   958
			mdio_write(ioaddr, 0x1f, 0x0000);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   959
			mdio_write(ioaddr, 0x0e, 0x0000);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   960
		}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   961
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   962
		mdio_write(ioaddr, MII_ADVERTISE, auto_nego);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   963
		mdio_write(ioaddr, MII_CTRL1000, giga_ctrl);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   964
	} else {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   965
		giga_ctrl = 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   966
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   967
		if (speed == SPEED_10)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   968
			bmcr = 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   969
		else if (speed == SPEED_100)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   970
			bmcr = BMCR_SPEED100;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   971
		else
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   972
			return -EINVAL;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   973
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   974
		if (duplex == DUPLEX_FULL)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   975
			bmcr |= BMCR_FULLDPLX;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   976
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   977
		mdio_write(ioaddr, 0x1f, 0x0000);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   978
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   979
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   980
	tp->phy_1000_ctrl_reg = giga_ctrl;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   981
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   982
	mdio_write(ioaddr, MII_BMCR, bmcr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   983
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   984
	if ((tp->mac_version == RTL_GIGA_MAC_VER_02) ||
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   985
	    (tp->mac_version == RTL_GIGA_MAC_VER_03)) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   986
		if ((speed == SPEED_100) && (autoneg != AUTONEG_ENABLE)) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   987
			mdio_write(ioaddr, 0x17, 0x2138);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   988
			mdio_write(ioaddr, 0x0e, 0x0260);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   989
		} else {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   990
			mdio_write(ioaddr, 0x17, 0x2108);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   991
			mdio_write(ioaddr, 0x0e, 0x0000);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   992
		}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   993
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   994
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   995
	return 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   996
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   997
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   998
static int rtl8169_set_speed(struct net_device *dev,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   999
			     u8 autoneg, u16 speed, u8 duplex)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1000
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1001
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1002
	int ret;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1003
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1004
	ret = tp->set_speed(dev, autoneg, speed, duplex);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1005
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1006
	if (netif_running(dev) && (tp->phy_1000_ctrl_reg & ADVERTISE_1000FULL))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1007
		mod_timer(&tp->timer, jiffies + RTL8169_PHY_TIMEOUT);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1008
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1009
	return ret;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1010
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1011
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1012
static int rtl8169_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1013
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1014
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1015
	unsigned long flags;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1016
	int ret;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1017
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1018
	spin_lock_irqsave(&tp->lock, flags);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1019
	ret = rtl8169_set_speed(dev, cmd->autoneg, cmd->speed, cmd->duplex);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1020
	spin_unlock_irqrestore(&tp->lock, flags);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1021
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1022
	return ret;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1023
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1024
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1025
static u32 rtl8169_get_rx_csum(struct net_device *dev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1026
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1027
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1028
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1029
	return tp->cp_cmd & RxChkSum;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1030
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1031
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1032
static int rtl8169_set_rx_csum(struct net_device *dev, u32 data)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1033
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1034
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1035
	void __iomem *ioaddr = tp->mmio_addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1036
	unsigned long flags;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1037
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1038
	spin_lock_irqsave(&tp->lock, flags);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1039
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1040
	if (data)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1041
		tp->cp_cmd |= RxChkSum;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1042
	else
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1043
		tp->cp_cmd &= ~RxChkSum;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1044
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1045
	RTL_W16(CPlusCmd, tp->cp_cmd);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1046
	RTL_R16(CPlusCmd);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1047
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1048
	spin_unlock_irqrestore(&tp->lock, flags);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1049
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1050
	return 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1051
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1052
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1053
#ifdef CONFIG_R8169_VLAN
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1054
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1055
static inline u32 rtl8169_tx_vlan_tag(struct rtl8169_private *tp,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1056
				      struct sk_buff *skb)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1057
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1058
	return (tp->vlgrp && vlan_tx_tag_present(skb)) ?
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1059
		TxVlanTag | swab16(vlan_tx_tag_get(skb)) : 0x00;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1060
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1061
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1062
static void rtl8169_vlan_rx_register(struct net_device *dev,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1063
				     struct vlan_group *grp)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1064
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1065
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1066
	void __iomem *ioaddr = tp->mmio_addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1067
	unsigned long flags;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1068
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1069
	spin_lock_irqsave(&tp->lock, flags);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1070
	tp->vlgrp = grp;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1071
	/*
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1072
	 * Do not disable RxVlan on 8110SCd.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1073
	 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1074
	if (tp->vlgrp || (tp->mac_version == RTL_GIGA_MAC_VER_05))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1075
		tp->cp_cmd |= RxVlan;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1076
	else
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1077
		tp->cp_cmd &= ~RxVlan;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1078
	RTL_W16(CPlusCmd, tp->cp_cmd);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1079
	RTL_R16(CPlusCmd);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1080
	spin_unlock_irqrestore(&tp->lock, flags);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1081
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1082
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1083
static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1084
			       struct sk_buff *skb, int polling)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1085
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1086
	u32 opts2 = le32_to_cpu(desc->opts2);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1087
	struct vlan_group *vlgrp = tp->vlgrp;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1088
	int ret;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1089
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1090
	if (vlgrp && (opts2 & RxVlanTag)) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1091
		__vlan_hwaccel_rx(skb, vlgrp, swab16(opts2 & 0xffff), polling);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1092
		ret = 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1093
	} else
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1094
		ret = -1;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1095
	desc->opts2 = 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1096
	return ret;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1097
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1098
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1099
#else /* !CONFIG_R8169_VLAN */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1100
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1101
static inline u32 rtl8169_tx_vlan_tag(struct rtl8169_private *tp,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1102
				      struct sk_buff *skb)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1103
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1104
	return 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1105
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1106
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1107
static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1108
			       struct sk_buff *skb, int polling)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1109
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1110
	return -1;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1111
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1112
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1113
#endif
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1114
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1115
static int rtl8169_gset_tbi(struct net_device *dev, struct ethtool_cmd *cmd)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1116
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1117
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1118
	void __iomem *ioaddr = tp->mmio_addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1119
	u32 status;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1120
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1121
	cmd->supported =
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1122
		SUPPORTED_1000baseT_Full | SUPPORTED_Autoneg | SUPPORTED_FIBRE;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1123
	cmd->port = PORT_FIBRE;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1124
	cmd->transceiver = XCVR_INTERNAL;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1125
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1126
	status = RTL_R32(TBICSR);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1127
	cmd->advertising = (status & TBINwEnable) ?  ADVERTISED_Autoneg : 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1128
	cmd->autoneg = !!(status & TBINwEnable);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1129
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1130
	cmd->speed = SPEED_1000;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1131
	cmd->duplex = DUPLEX_FULL; /* Always set */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1132
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1133
	return 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1134
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1135
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1136
static int rtl8169_gset_xmii(struct net_device *dev, struct ethtool_cmd *cmd)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1137
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1138
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1139
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1140
	return mii_ethtool_gset(&tp->mii, cmd);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1141
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1142
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1143
static int rtl8169_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1144
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1145
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1146
	unsigned long flags;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1147
	int rc;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1148
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1149
	spin_lock_irqsave(&tp->lock, flags);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1150
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1151
	rc = tp->get_settings(dev, cmd);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1152
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1153
	spin_unlock_irqrestore(&tp->lock, flags);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1154
	return rc;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1155
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1156
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1157
static void rtl8169_get_regs(struct net_device *dev, struct ethtool_regs *regs,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1158
			     void *p)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1159
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1160
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1161
	unsigned long flags;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1162
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1163
	if (regs->len > R8169_REGS_SIZE)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1164
		regs->len = R8169_REGS_SIZE;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1165
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1166
	spin_lock_irqsave(&tp->lock, flags);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1167
	memcpy_fromio(p, tp->mmio_addr, regs->len);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1168
	spin_unlock_irqrestore(&tp->lock, flags);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1169
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1170
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1171
static u32 rtl8169_get_msglevel(struct net_device *dev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1172
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1173
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1174
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1175
	return tp->msg_enable;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1176
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1177
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1178
static void rtl8169_set_msglevel(struct net_device *dev, u32 value)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1179
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1180
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1181
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1182
	tp->msg_enable = value;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1183
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1184
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1185
static const char rtl8169_gstrings[][ETH_GSTRING_LEN] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1186
	"tx_packets",
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1187
	"rx_packets",
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1188
	"tx_errors",
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1189
	"rx_errors",
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1190
	"rx_missed",
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1191
	"align_errors",
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1192
	"tx_single_collisions",
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1193
	"tx_multi_collisions",
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1194
	"unicast",
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1195
	"broadcast",
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1196
	"multicast",
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1197
	"tx_aborted",
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1198
	"tx_underrun",
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1199
};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1200
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1201
static int rtl8169_get_sset_count(struct net_device *dev, int sset)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1202
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1203
	switch (sset) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1204
	case ETH_SS_STATS:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1205
		return ARRAY_SIZE(rtl8169_gstrings);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1206
	default:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1207
		return -EOPNOTSUPP;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1208
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1209
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1210
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1211
static void rtl8169_update_counters(struct net_device *dev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1212
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1213
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1214
	void __iomem *ioaddr = tp->mmio_addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1215
	struct rtl8169_counters *counters;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1216
	dma_addr_t paddr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1217
	u32 cmd;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1218
	int wait = 1000;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1219
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1220
	/*
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1221
	 * Some chips are unable to dump tally counters when the receiver
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1222
	 * is disabled.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1223
	 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1224
	if ((RTL_R8(ChipCmd) & CmdRxEnb) == 0)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1225
		return;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1226
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1227
	counters = pci_alloc_consistent(tp->pci_dev, sizeof(*counters), &paddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1228
	if (!counters)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1229
		return;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1230
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1231
	RTL_W32(CounterAddrHigh, (u64)paddr >> 32);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1232
	cmd = (u64)paddr & DMA_BIT_MASK(32);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1233
	RTL_W32(CounterAddrLow, cmd);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1234
	RTL_W32(CounterAddrLow, cmd | CounterDump);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1235
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1236
	while (wait--) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1237
		if ((RTL_R32(CounterAddrLow) & CounterDump) == 0) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1238
			/* copy updated counters */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1239
			memcpy(&tp->counters, counters, sizeof(*counters));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1240
			break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1241
		}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1242
		udelay(10);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1243
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1244
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1245
	RTL_W32(CounterAddrLow, 0);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1246
	RTL_W32(CounterAddrHigh, 0);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1247
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1248
	pci_free_consistent(tp->pci_dev, sizeof(*counters), counters, paddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1249
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1250
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1251
static void rtl8169_get_ethtool_stats(struct net_device *dev,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1252
				      struct ethtool_stats *stats, u64 *data)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1253
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1254
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1255
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1256
	ASSERT_RTNL();
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1257
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1258
	rtl8169_update_counters(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1259
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1260
	data[0] = le64_to_cpu(tp->counters.tx_packets);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1261
	data[1] = le64_to_cpu(tp->counters.rx_packets);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1262
	data[2] = le64_to_cpu(tp->counters.tx_errors);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1263
	data[3] = le32_to_cpu(tp->counters.rx_errors);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1264
	data[4] = le16_to_cpu(tp->counters.rx_missed);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1265
	data[5] = le16_to_cpu(tp->counters.align_errors);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1266
	data[6] = le32_to_cpu(tp->counters.tx_one_collision);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1267
	data[7] = le32_to_cpu(tp->counters.tx_multi_collision);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1268
	data[8] = le64_to_cpu(tp->counters.rx_unicast);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1269
	data[9] = le64_to_cpu(tp->counters.rx_broadcast);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1270
	data[10] = le32_to_cpu(tp->counters.rx_multicast);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1271
	data[11] = le16_to_cpu(tp->counters.tx_aborted);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1272
	data[12] = le16_to_cpu(tp->counters.tx_underun);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1273
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1274
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1275
static void rtl8169_get_strings(struct net_device *dev, u32 stringset, u8 *data)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1276
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1277
	switch(stringset) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1278
	case ETH_SS_STATS:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1279
		memcpy(data, *rtl8169_gstrings, sizeof(rtl8169_gstrings));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1280
		break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1281
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1282
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1283
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1284
static const struct ethtool_ops rtl8169_ethtool_ops = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1285
	.get_drvinfo		= rtl8169_get_drvinfo,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1286
	.get_regs_len		= rtl8169_get_regs_len,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1287
	.get_link		= ethtool_op_get_link,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1288
	.get_settings		= rtl8169_get_settings,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1289
	.set_settings		= rtl8169_set_settings,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1290
	.get_msglevel		= rtl8169_get_msglevel,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1291
	.set_msglevel		= rtl8169_set_msglevel,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1292
	.get_rx_csum		= rtl8169_get_rx_csum,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1293
	.set_rx_csum		= rtl8169_set_rx_csum,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1294
	.set_tx_csum		= ethtool_op_set_tx_csum,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1295
	.set_sg			= ethtool_op_set_sg,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1296
	.set_tso		= ethtool_op_set_tso,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1297
	.get_regs		= rtl8169_get_regs,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1298
	.get_wol		= rtl8169_get_wol,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1299
	.set_wol		= rtl8169_set_wol,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1300
	.get_strings		= rtl8169_get_strings,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1301
	.get_sset_count		= rtl8169_get_sset_count,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1302
	.get_ethtool_stats	= rtl8169_get_ethtool_stats,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1303
};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1304
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1305
static void rtl8169_get_mac_version(struct rtl8169_private *tp,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1306
				    void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1307
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1308
	/*
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1309
	 * The driver currently handles the 8168Bf and the 8168Be identically
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1310
	 * but they can be identified more specifically through the test below
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1311
	 * if needed:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1312
	 *
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1313
	 * (RTL_R32(TxConfig) & 0x700000) == 0x500000 ? 8168Bf : 8168Be
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1314
	 *
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1315
	 * Same thing for the 8101Eb and the 8101Ec:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1316
	 *
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1317
	 * (RTL_R32(TxConfig) & 0x700000) == 0x200000 ? 8101Eb : 8101Ec
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1318
	 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1319
	static const struct {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1320
		u32 mask;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1321
		u32 val;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1322
		int mac_version;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1323
	} mac_info[] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1324
		/* 8168D family. */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1325
		{ 0x7cf00000, 0x28300000,	RTL_GIGA_MAC_VER_26 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1326
		{ 0x7cf00000, 0x28100000,	RTL_GIGA_MAC_VER_25 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1327
		{ 0x7c800000, 0x28800000,	RTL_GIGA_MAC_VER_27 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1328
		{ 0x7c800000, 0x28000000,	RTL_GIGA_MAC_VER_26 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1329
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1330
		/* 8168C family. */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1331
		{ 0x7cf00000, 0x3cb00000,	RTL_GIGA_MAC_VER_24 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1332
		{ 0x7cf00000, 0x3c900000,	RTL_GIGA_MAC_VER_23 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1333
		{ 0x7cf00000, 0x3c800000,	RTL_GIGA_MAC_VER_18 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1334
		{ 0x7c800000, 0x3c800000,	RTL_GIGA_MAC_VER_24 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1335
		{ 0x7cf00000, 0x3c000000,	RTL_GIGA_MAC_VER_19 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1336
		{ 0x7cf00000, 0x3c200000,	RTL_GIGA_MAC_VER_20 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1337
		{ 0x7cf00000, 0x3c300000,	RTL_GIGA_MAC_VER_21 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1338
		{ 0x7cf00000, 0x3c400000,	RTL_GIGA_MAC_VER_22 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1339
		{ 0x7c800000, 0x3c000000,	RTL_GIGA_MAC_VER_22 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1340
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1341
		/* 8168B family. */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1342
		{ 0x7cf00000, 0x38000000,	RTL_GIGA_MAC_VER_12 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1343
		{ 0x7cf00000, 0x38500000,	RTL_GIGA_MAC_VER_17 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1344
		{ 0x7c800000, 0x38000000,	RTL_GIGA_MAC_VER_17 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1345
		{ 0x7c800000, 0x30000000,	RTL_GIGA_MAC_VER_11 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1346
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1347
		/* 8101 family. */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1348
		{ 0x7cf00000, 0x34a00000,	RTL_GIGA_MAC_VER_09 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1349
		{ 0x7cf00000, 0x24a00000,	RTL_GIGA_MAC_VER_09 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1350
		{ 0x7cf00000, 0x34900000,	RTL_GIGA_MAC_VER_08 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1351
		{ 0x7cf00000, 0x24900000,	RTL_GIGA_MAC_VER_08 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1352
		{ 0x7cf00000, 0x34800000,	RTL_GIGA_MAC_VER_07 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1353
		{ 0x7cf00000, 0x24800000,	RTL_GIGA_MAC_VER_07 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1354
		{ 0x7cf00000, 0x34000000,	RTL_GIGA_MAC_VER_13 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1355
		{ 0x7cf00000, 0x34300000,	RTL_GIGA_MAC_VER_10 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1356
		{ 0x7cf00000, 0x34200000,	RTL_GIGA_MAC_VER_16 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1357
		{ 0x7c800000, 0x34800000,	RTL_GIGA_MAC_VER_09 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1358
		{ 0x7c800000, 0x24800000,	RTL_GIGA_MAC_VER_09 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1359
		{ 0x7c800000, 0x34000000,	RTL_GIGA_MAC_VER_16 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1360
		/* FIXME: where did these entries come from ? -- FR */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1361
		{ 0xfc800000, 0x38800000,	RTL_GIGA_MAC_VER_15 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1362
		{ 0xfc800000, 0x30800000,	RTL_GIGA_MAC_VER_14 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1363
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1364
		/* 8110 family. */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1365
		{ 0xfc800000, 0x98000000,	RTL_GIGA_MAC_VER_06 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1366
		{ 0xfc800000, 0x18000000,	RTL_GIGA_MAC_VER_05 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1367
		{ 0xfc800000, 0x10000000,	RTL_GIGA_MAC_VER_04 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1368
		{ 0xfc800000, 0x04000000,	RTL_GIGA_MAC_VER_03 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1369
		{ 0xfc800000, 0x00800000,	RTL_GIGA_MAC_VER_02 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1370
		{ 0xfc800000, 0x00000000,	RTL_GIGA_MAC_VER_01 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1371
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1372
		/* Catch-all */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1373
		{ 0x00000000, 0x00000000,	RTL_GIGA_MAC_NONE   }
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1374
	}, *p = mac_info;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1375
	u32 reg;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1376
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1377
	reg = RTL_R32(TxConfig);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1378
	while ((reg & p->mask) != p->val)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1379
		p++;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1380
	tp->mac_version = p->mac_version;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1381
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1382
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1383
static void rtl8169_print_mac_version(struct rtl8169_private *tp)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1384
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1385
	dprintk("mac_version = 0x%02x\n", tp->mac_version);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1386
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1387
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1388
struct phy_reg {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1389
	u16 reg;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1390
	u16 val;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1391
};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1392
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1393
static void rtl_phy_write(void __iomem *ioaddr, const struct phy_reg *regs, int len)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1394
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1395
	while (len-- > 0) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1396
		mdio_write(ioaddr, regs->reg, regs->val);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1397
		regs++;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1398
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1399
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1400
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1401
static void rtl8169s_hw_phy_config(void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1402
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1403
	static const struct phy_reg phy_reg_init[] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1404
		{ 0x1f, 0x0001 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1405
		{ 0x06, 0x006e },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1406
		{ 0x08, 0x0708 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1407
		{ 0x15, 0x4000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1408
		{ 0x18, 0x65c7 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1409
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1410
		{ 0x1f, 0x0001 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1411
		{ 0x03, 0x00a1 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1412
		{ 0x02, 0x0008 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1413
		{ 0x01, 0x0120 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1414
		{ 0x00, 0x1000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1415
		{ 0x04, 0x0800 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1416
		{ 0x04, 0x0000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1417
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1418
		{ 0x03, 0xff41 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1419
		{ 0x02, 0xdf60 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1420
		{ 0x01, 0x0140 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1421
		{ 0x00, 0x0077 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1422
		{ 0x04, 0x7800 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1423
		{ 0x04, 0x7000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1424
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1425
		{ 0x03, 0x802f },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1426
		{ 0x02, 0x4f02 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1427
		{ 0x01, 0x0409 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1428
		{ 0x00, 0xf0f9 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1429
		{ 0x04, 0x9800 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1430
		{ 0x04, 0x9000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1431
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1432
		{ 0x03, 0xdf01 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1433
		{ 0x02, 0xdf20 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1434
		{ 0x01, 0xff95 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1435
		{ 0x00, 0xba00 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1436
		{ 0x04, 0xa800 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1437
		{ 0x04, 0xa000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1438
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1439
		{ 0x03, 0xff41 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1440
		{ 0x02, 0xdf20 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1441
		{ 0x01, 0x0140 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1442
		{ 0x00, 0x00bb },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1443
		{ 0x04, 0xb800 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1444
		{ 0x04, 0xb000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1445
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1446
		{ 0x03, 0xdf41 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1447
		{ 0x02, 0xdc60 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1448
		{ 0x01, 0x6340 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1449
		{ 0x00, 0x007d },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1450
		{ 0x04, 0xd800 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1451
		{ 0x04, 0xd000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1452
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1453
		{ 0x03, 0xdf01 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1454
		{ 0x02, 0xdf20 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1455
		{ 0x01, 0x100a },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1456
		{ 0x00, 0xa0ff },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1457
		{ 0x04, 0xf800 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1458
		{ 0x04, 0xf000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1459
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1460
		{ 0x1f, 0x0000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1461
		{ 0x0b, 0x0000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1462
		{ 0x00, 0x9200 }
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1463
	};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1464
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1465
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1466
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1467
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1468
static void rtl8169sb_hw_phy_config(void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1469
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1470
	static const struct phy_reg phy_reg_init[] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1471
		{ 0x1f, 0x0002 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1472
		{ 0x01, 0x90d0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1473
		{ 0x1f, 0x0000 }
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1474
	};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1475
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1476
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1477
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1478
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1479
static void rtl8169scd_hw_phy_config_quirk(struct rtl8169_private *tp,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1480
					   void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1481
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1482
	struct pci_dev *pdev = tp->pci_dev;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1483
	u16 vendor_id, device_id;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1484
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1485
	pci_read_config_word(pdev, PCI_SUBSYSTEM_VENDOR_ID, &vendor_id);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1486
	pci_read_config_word(pdev, PCI_SUBSYSTEM_ID, &device_id);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1487
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1488
	if ((vendor_id != PCI_VENDOR_ID_GIGABYTE) || (device_id != 0xe000))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1489
		return;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1490
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1491
	mdio_write(ioaddr, 0x1f, 0x0001);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1492
	mdio_write(ioaddr, 0x10, 0xf01b);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1493
	mdio_write(ioaddr, 0x1f, 0x0000);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1494
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1495
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1496
static void rtl8169scd_hw_phy_config(struct rtl8169_private *tp,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1497
				     void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1498
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1499
	static const struct phy_reg phy_reg_init[] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1500
		{ 0x1f, 0x0001 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1501
		{ 0x04, 0x0000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1502
		{ 0x03, 0x00a1 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1503
		{ 0x02, 0x0008 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1504
		{ 0x01, 0x0120 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1505
		{ 0x00, 0x1000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1506
		{ 0x04, 0x0800 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1507
		{ 0x04, 0x9000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1508
		{ 0x03, 0x802f },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1509
		{ 0x02, 0x4f02 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1510
		{ 0x01, 0x0409 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1511
		{ 0x00, 0xf099 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1512
		{ 0x04, 0x9800 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1513
		{ 0x04, 0xa000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1514
		{ 0x03, 0xdf01 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1515
		{ 0x02, 0xdf20 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1516
		{ 0x01, 0xff95 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1517
		{ 0x00, 0xba00 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1518
		{ 0x04, 0xa800 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1519
		{ 0x04, 0xf000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1520
		{ 0x03, 0xdf01 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1521
		{ 0x02, 0xdf20 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1522
		{ 0x01, 0x101a },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1523
		{ 0x00, 0xa0ff },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1524
		{ 0x04, 0xf800 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1525
		{ 0x04, 0x0000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1526
		{ 0x1f, 0x0000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1527
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1528
		{ 0x1f, 0x0001 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1529
		{ 0x10, 0xf41b },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1530
		{ 0x14, 0xfb54 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1531
		{ 0x18, 0xf5c7 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1532
		{ 0x1f, 0x0000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1533
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1534
		{ 0x1f, 0x0001 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1535
		{ 0x17, 0x0cc0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1536
		{ 0x1f, 0x0000 }
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1537
	};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1538
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1539
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1540
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1541
	rtl8169scd_hw_phy_config_quirk(tp, ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1542
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1543
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1544
static void rtl8169sce_hw_phy_config(void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1545
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1546
	static const struct phy_reg phy_reg_init[] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1547
		{ 0x1f, 0x0001 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1548
		{ 0x04, 0x0000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1549
		{ 0x03, 0x00a1 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1550
		{ 0x02, 0x0008 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1551
		{ 0x01, 0x0120 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1552
		{ 0x00, 0x1000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1553
		{ 0x04, 0x0800 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1554
		{ 0x04, 0x9000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1555
		{ 0x03, 0x802f },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1556
		{ 0x02, 0x4f02 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1557
		{ 0x01, 0x0409 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1558
		{ 0x00, 0xf099 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1559
		{ 0x04, 0x9800 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1560
		{ 0x04, 0xa000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1561
		{ 0x03, 0xdf01 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1562
		{ 0x02, 0xdf20 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1563
		{ 0x01, 0xff95 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1564
		{ 0x00, 0xba00 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1565
		{ 0x04, 0xa800 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1566
		{ 0x04, 0xf000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1567
		{ 0x03, 0xdf01 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1568
		{ 0x02, 0xdf20 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1569
		{ 0x01, 0x101a },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1570
		{ 0x00, 0xa0ff },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1571
		{ 0x04, 0xf800 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1572
		{ 0x04, 0x0000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1573
		{ 0x1f, 0x0000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1574
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1575
		{ 0x1f, 0x0001 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1576
		{ 0x0b, 0x8480 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1577
		{ 0x1f, 0x0000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1578
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1579
		{ 0x1f, 0x0001 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1580
		{ 0x18, 0x67c7 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1581
		{ 0x04, 0x2000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1582
		{ 0x03, 0x002f },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1583
		{ 0x02, 0x4360 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1584
		{ 0x01, 0x0109 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1585
		{ 0x00, 0x3022 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1586
		{ 0x04, 0x2800 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1587
		{ 0x1f, 0x0000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1588
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1589
		{ 0x1f, 0x0001 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1590
		{ 0x17, 0x0cc0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1591
		{ 0x1f, 0x0000 }
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1592
	};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1593
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1594
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1595
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1596
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1597
static void rtl8168bb_hw_phy_config(void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1598
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1599
	static const struct phy_reg phy_reg_init[] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1600
		{ 0x10, 0xf41b },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1601
		{ 0x1f, 0x0000 }
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1602
	};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1603
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1604
	mdio_write(ioaddr, 0x1f, 0x0001);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1605
	mdio_patch(ioaddr, 0x16, 1 << 0);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1606
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1607
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1608
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1609
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1610
static void rtl8168bef_hw_phy_config(void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1611
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1612
	static const struct phy_reg phy_reg_init[] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1613
		{ 0x1f, 0x0001 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1614
		{ 0x10, 0xf41b },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1615
		{ 0x1f, 0x0000 }
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1616
	};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1617
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1618
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1619
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1620
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1621
static void rtl8168cp_1_hw_phy_config(void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1622
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1623
	static const struct phy_reg phy_reg_init[] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1624
		{ 0x1f, 0x0000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1625
		{ 0x1d, 0x0f00 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1626
		{ 0x1f, 0x0002 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1627
		{ 0x0c, 0x1ec8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1628
		{ 0x1f, 0x0000 }
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1629
	};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1630
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1631
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1632
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1633
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1634
static void rtl8168cp_2_hw_phy_config(void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1635
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1636
	static const struct phy_reg phy_reg_init[] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1637
		{ 0x1f, 0x0001 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1638
		{ 0x1d, 0x3d98 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1639
		{ 0x1f, 0x0000 }
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1640
	};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1641
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1642
	mdio_write(ioaddr, 0x1f, 0x0000);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1643
	mdio_patch(ioaddr, 0x14, 1 << 5);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1644
	mdio_patch(ioaddr, 0x0d, 1 << 5);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1645
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1646
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1647
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1648
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1649
static void rtl8168c_1_hw_phy_config(void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1650
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1651
	static const struct phy_reg phy_reg_init[] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1652
		{ 0x1f, 0x0001 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1653
		{ 0x12, 0x2300 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1654
		{ 0x1f, 0x0002 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1655
		{ 0x00, 0x88d4 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1656
		{ 0x01, 0x82b1 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1657
		{ 0x03, 0x7002 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1658
		{ 0x08, 0x9e30 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1659
		{ 0x09, 0x01f0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1660
		{ 0x0a, 0x5500 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1661
		{ 0x0c, 0x00c8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1662
		{ 0x1f, 0x0003 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1663
		{ 0x12, 0xc096 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1664
		{ 0x16, 0x000a },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1665
		{ 0x1f, 0x0000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1666
		{ 0x1f, 0x0000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1667
		{ 0x09, 0x2000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1668
		{ 0x09, 0x0000 }
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1669
	};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1670
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1671
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1672
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1673
	mdio_patch(ioaddr, 0x14, 1 << 5);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1674
	mdio_patch(ioaddr, 0x0d, 1 << 5);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1675
	mdio_write(ioaddr, 0x1f, 0x0000);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1676
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1677
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1678
static void rtl8168c_2_hw_phy_config(void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1679
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1680
	static const struct phy_reg phy_reg_init[] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1681
		{ 0x1f, 0x0001 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1682
		{ 0x12, 0x2300 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1683
		{ 0x03, 0x802f },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1684
		{ 0x02, 0x4f02 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1685
		{ 0x01, 0x0409 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1686
		{ 0x00, 0xf099 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1687
		{ 0x04, 0x9800 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1688
		{ 0x04, 0x9000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1689
		{ 0x1d, 0x3d98 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1690
		{ 0x1f, 0x0002 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1691
		{ 0x0c, 0x7eb8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1692
		{ 0x06, 0x0761 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1693
		{ 0x1f, 0x0003 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1694
		{ 0x16, 0x0f0a },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1695
		{ 0x1f, 0x0000 }
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1696
	};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1697
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1698
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1699
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1700
	mdio_patch(ioaddr, 0x16, 1 << 0);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1701
	mdio_patch(ioaddr, 0x14, 1 << 5);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1702
	mdio_patch(ioaddr, 0x0d, 1 << 5);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1703
	mdio_write(ioaddr, 0x1f, 0x0000);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1704
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1705
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1706
static void rtl8168c_3_hw_phy_config(void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1707
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1708
	static const struct phy_reg phy_reg_init[] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1709
		{ 0x1f, 0x0001 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1710
		{ 0x12, 0x2300 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1711
		{ 0x1d, 0x3d98 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1712
		{ 0x1f, 0x0002 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1713
		{ 0x0c, 0x7eb8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1714
		{ 0x06, 0x5461 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1715
		{ 0x1f, 0x0003 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1716
		{ 0x16, 0x0f0a },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1717
		{ 0x1f, 0x0000 }
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1718
	};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1719
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1720
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1721
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1722
	mdio_patch(ioaddr, 0x16, 1 << 0);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1723
	mdio_patch(ioaddr, 0x14, 1 << 5);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1724
	mdio_patch(ioaddr, 0x0d, 1 << 5);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1725
	mdio_write(ioaddr, 0x1f, 0x0000);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1726
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1727
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1728
static void rtl8168c_4_hw_phy_config(void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1729
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1730
	rtl8168c_3_hw_phy_config(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1731
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1732
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1733
static void rtl8168d_1_hw_phy_config(void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1734
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1735
	static const struct phy_reg phy_reg_init_0[] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1736
		{ 0x1f, 0x0001 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1737
		{ 0x06, 0x4064 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1738
		{ 0x07, 0x2863 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1739
		{ 0x08, 0x059c },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1740
		{ 0x09, 0x26b4 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1741
		{ 0x0a, 0x6a19 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1742
		{ 0x0b, 0xdcc8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1743
		{ 0x10, 0xf06d },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1744
		{ 0x14, 0x7f68 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1745
		{ 0x18, 0x7fd9 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1746
		{ 0x1c, 0xf0ff },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1747
		{ 0x1d, 0x3d9c },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1748
		{ 0x1f, 0x0003 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1749
		{ 0x12, 0xf49f },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1750
		{ 0x13, 0x070b },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1751
		{ 0x1a, 0x05ad },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1752
		{ 0x14, 0x94c0 }
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1753
	};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1754
	static const struct phy_reg phy_reg_init_1[] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1755
		{ 0x1f, 0x0002 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1756
		{ 0x06, 0x5561 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1757
		{ 0x1f, 0x0005 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1758
		{ 0x05, 0x8332 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1759
		{ 0x06, 0x5561 }
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1760
	};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1761
	static const struct phy_reg phy_reg_init_2[] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1762
		{ 0x1f, 0x0005 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1763
		{ 0x05, 0xffc2 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1764
		{ 0x1f, 0x0005 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1765
		{ 0x05, 0x8000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1766
		{ 0x06, 0xf8f9 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1767
		{ 0x06, 0xfaef },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1768
		{ 0x06, 0x59ee },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1769
		{ 0x06, 0xf8ea },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1770
		{ 0x06, 0x00ee },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1771
		{ 0x06, 0xf8eb },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1772
		{ 0x06, 0x00e0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1773
		{ 0x06, 0xf87c },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1774
		{ 0x06, 0xe1f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1775
		{ 0x06, 0x7d59 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1776
		{ 0x06, 0x0fef },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1777
		{ 0x06, 0x0139 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1778
		{ 0x06, 0x029e },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1779
		{ 0x06, 0x06ef },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1780
		{ 0x06, 0x1039 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1781
		{ 0x06, 0x089f },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1782
		{ 0x06, 0x2aee },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1783
		{ 0x06, 0xf8ea },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1784
		{ 0x06, 0x00ee },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1785
		{ 0x06, 0xf8eb },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1786
		{ 0x06, 0x01e0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1787
		{ 0x06, 0xf87c },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1788
		{ 0x06, 0xe1f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1789
		{ 0x06, 0x7d58 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1790
		{ 0x06, 0x409e },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1791
		{ 0x06, 0x0f39 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1792
		{ 0x06, 0x46aa },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1793
		{ 0x06, 0x0bbf },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1794
		{ 0x06, 0x8290 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1795
		{ 0x06, 0xd682 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1796
		{ 0x06, 0x9802 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1797
		{ 0x06, 0x014f },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1798
		{ 0x06, 0xae09 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1799
		{ 0x06, 0xbf82 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1800
		{ 0x06, 0x98d6 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1801
		{ 0x06, 0x82a0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1802
		{ 0x06, 0x0201 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1803
		{ 0x06, 0x4fef },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1804
		{ 0x06, 0x95fe },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1805
		{ 0x06, 0xfdfc },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1806
		{ 0x06, 0x05f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1807
		{ 0x06, 0xf9fa },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1808
		{ 0x06, 0xeef8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1809
		{ 0x06, 0xea00 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1810
		{ 0x06, 0xeef8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1811
		{ 0x06, 0xeb00 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1812
		{ 0x06, 0xe2f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1813
		{ 0x06, 0x7ce3 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1814
		{ 0x06, 0xf87d },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1815
		{ 0x06, 0xa511 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1816
		{ 0x06, 0x1112 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1817
		{ 0x06, 0xd240 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1818
		{ 0x06, 0xd644 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1819
		{ 0x06, 0x4402 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1820
		{ 0x06, 0x8217 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1821
		{ 0x06, 0xd2a0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1822
		{ 0x06, 0xd6aa },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1823
		{ 0x06, 0xaa02 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1824
		{ 0x06, 0x8217 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1825
		{ 0x06, 0xae0f },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1826
		{ 0x06, 0xa544 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1827
		{ 0x06, 0x4402 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1828
		{ 0x06, 0xae4d },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1829
		{ 0x06, 0xa5aa },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1830
		{ 0x06, 0xaa02 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1831
		{ 0x06, 0xae47 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1832
		{ 0x06, 0xaf82 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1833
		{ 0x06, 0x13ee },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1834
		{ 0x06, 0x834e },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1835
		{ 0x06, 0x00ee },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1836
		{ 0x06, 0x834d },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1837
		{ 0x06, 0x0fee },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1838
		{ 0x06, 0x834c },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1839
		{ 0x06, 0x0fee },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1840
		{ 0x06, 0x834f },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1841
		{ 0x06, 0x00ee },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1842
		{ 0x06, 0x8351 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1843
		{ 0x06, 0x00ee },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1844
		{ 0x06, 0x834a },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1845
		{ 0x06, 0xffee },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1846
		{ 0x06, 0x834b },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1847
		{ 0x06, 0xffe0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1848
		{ 0x06, 0x8330 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1849
		{ 0x06, 0xe183 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1850
		{ 0x06, 0x3158 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1851
		{ 0x06, 0xfee4 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1852
		{ 0x06, 0xf88a },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1853
		{ 0x06, 0xe5f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1854
		{ 0x06, 0x8be0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1855
		{ 0x06, 0x8332 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1856
		{ 0x06, 0xe183 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1857
		{ 0x06, 0x3359 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1858
		{ 0x06, 0x0fe2 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1859
		{ 0x06, 0x834d },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1860
		{ 0x06, 0x0c24 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1861
		{ 0x06, 0x5af0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1862
		{ 0x06, 0x1e12 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1863
		{ 0x06, 0xe4f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1864
		{ 0x06, 0x8ce5 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1865
		{ 0x06, 0xf88d },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1866
		{ 0x06, 0xaf82 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1867
		{ 0x06, 0x13e0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1868
		{ 0x06, 0x834f },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1869
		{ 0x06, 0x10e4 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1870
		{ 0x06, 0x834f },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1871
		{ 0x06, 0xe083 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1872
		{ 0x06, 0x4e78 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1873
		{ 0x06, 0x009f },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1874
		{ 0x06, 0x0ae0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1875
		{ 0x06, 0x834f },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1876
		{ 0x06, 0xa010 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1877
		{ 0x06, 0xa5ee },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1878
		{ 0x06, 0x834e },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1879
		{ 0x06, 0x01e0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1880
		{ 0x06, 0x834e },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1881
		{ 0x06, 0x7805 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1882
		{ 0x06, 0x9e9a },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1883
		{ 0x06, 0xe083 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1884
		{ 0x06, 0x4e78 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1885
		{ 0x06, 0x049e },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1886
		{ 0x06, 0x10e0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1887
		{ 0x06, 0x834e },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1888
		{ 0x06, 0x7803 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1889
		{ 0x06, 0x9e0f },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1890
		{ 0x06, 0xe083 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1891
		{ 0x06, 0x4e78 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1892
		{ 0x06, 0x019e },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1893
		{ 0x06, 0x05ae },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1894
		{ 0x06, 0x0caf },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1895
		{ 0x06, 0x81f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1896
		{ 0x06, 0xaf81 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1897
		{ 0x06, 0xa3af },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1898
		{ 0x06, 0x81dc },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1899
		{ 0x06, 0xaf82 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1900
		{ 0x06, 0x13ee },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1901
		{ 0x06, 0x8348 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1902
		{ 0x06, 0x00ee },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1903
		{ 0x06, 0x8349 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1904
		{ 0x06, 0x00e0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1905
		{ 0x06, 0x8351 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1906
		{ 0x06, 0x10e4 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1907
		{ 0x06, 0x8351 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1908
		{ 0x06, 0x5801 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1909
		{ 0x06, 0x9fea },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1910
		{ 0x06, 0xd000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1911
		{ 0x06, 0xd180 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1912
		{ 0x06, 0x1f66 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1913
		{ 0x06, 0xe2f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1914
		{ 0x06, 0xeae3 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1915
		{ 0x06, 0xf8eb },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1916
		{ 0x06, 0x5af8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1917
		{ 0x06, 0x1e20 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1918
		{ 0x06, 0xe6f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1919
		{ 0x06, 0xeae5 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1920
		{ 0x06, 0xf8eb },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1921
		{ 0x06, 0xd302 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1922
		{ 0x06, 0xb3fe },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1923
		{ 0x06, 0xe2f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1924
		{ 0x06, 0x7cef },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1925
		{ 0x06, 0x325b },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1926
		{ 0x06, 0x80e3 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1927
		{ 0x06, 0xf87d },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1928
		{ 0x06, 0x9e03 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1929
		{ 0x06, 0x7dff },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1930
		{ 0x06, 0xff0d },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1931
		{ 0x06, 0x581c },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1932
		{ 0x06, 0x551a },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1933
		{ 0x06, 0x6511 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1934
		{ 0x06, 0xa190 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1935
		{ 0x06, 0xd3e2 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1936
		{ 0x06, 0x8348 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1937
		{ 0x06, 0xe383 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1938
		{ 0x06, 0x491b },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1939
		{ 0x06, 0x56ab },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1940
		{ 0x06, 0x08ef },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1941
		{ 0x06, 0x56e6 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1942
		{ 0x06, 0x8348 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1943
		{ 0x06, 0xe783 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1944
		{ 0x06, 0x4910 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1945
		{ 0x06, 0xd180 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1946
		{ 0x06, 0x1f66 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1947
		{ 0x06, 0xa004 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1948
		{ 0x06, 0xb9e2 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1949
		{ 0x06, 0x8348 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1950
		{ 0x06, 0xe383 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1951
		{ 0x06, 0x49ef },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1952
		{ 0x06, 0x65e2 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1953
		{ 0x06, 0x834a },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1954
		{ 0x06, 0xe383 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1955
		{ 0x06, 0x4b1b },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1956
		{ 0x06, 0x56aa },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1957
		{ 0x06, 0x0eef },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1958
		{ 0x06, 0x56e6 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1959
		{ 0x06, 0x834a },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1960
		{ 0x06, 0xe783 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1961
		{ 0x06, 0x4be2 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1962
		{ 0x06, 0x834d },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1963
		{ 0x06, 0xe683 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1964
		{ 0x06, 0x4ce0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1965
		{ 0x06, 0x834d },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1966
		{ 0x06, 0xa000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1967
		{ 0x06, 0x0caf },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1968
		{ 0x06, 0x81dc },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1969
		{ 0x06, 0xe083 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1970
		{ 0x06, 0x4d10 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1971
		{ 0x06, 0xe483 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1972
		{ 0x06, 0x4dae },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1973
		{ 0x06, 0x0480 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1974
		{ 0x06, 0xe483 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1975
		{ 0x06, 0x4de0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1976
		{ 0x06, 0x834e },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1977
		{ 0x06, 0x7803 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1978
		{ 0x06, 0x9e0b },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1979
		{ 0x06, 0xe083 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1980
		{ 0x06, 0x4e78 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1981
		{ 0x06, 0x049e },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1982
		{ 0x06, 0x04ee },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1983
		{ 0x06, 0x834e },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1984
		{ 0x06, 0x02e0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1985
		{ 0x06, 0x8332 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1986
		{ 0x06, 0xe183 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1987
		{ 0x06, 0x3359 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1988
		{ 0x06, 0x0fe2 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1989
		{ 0x06, 0x834d },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1990
		{ 0x06, 0x0c24 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1991
		{ 0x06, 0x5af0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1992
		{ 0x06, 0x1e12 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1993
		{ 0x06, 0xe4f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1994
		{ 0x06, 0x8ce5 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1995
		{ 0x06, 0xf88d },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1996
		{ 0x06, 0xe083 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1997
		{ 0x06, 0x30e1 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1998
		{ 0x06, 0x8331 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1999
		{ 0x06, 0x6801 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2000
		{ 0x06, 0xe4f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2001
		{ 0x06, 0x8ae5 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2002
		{ 0x06, 0xf88b },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2003
		{ 0x06, 0xae37 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2004
		{ 0x06, 0xee83 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2005
		{ 0x06, 0x4e03 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2006
		{ 0x06, 0xe083 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2007
		{ 0x06, 0x4ce1 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2008
		{ 0x06, 0x834d },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2009
		{ 0x06, 0x1b01 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2010
		{ 0x06, 0x9e04 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2011
		{ 0x06, 0xaaa1 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2012
		{ 0x06, 0xaea8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2013
		{ 0x06, 0xee83 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2014
		{ 0x06, 0x4e04 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2015
		{ 0x06, 0xee83 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2016
		{ 0x06, 0x4f00 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2017
		{ 0x06, 0xaeab },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2018
		{ 0x06, 0xe083 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2019
		{ 0x06, 0x4f78 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2020
		{ 0x06, 0x039f },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2021
		{ 0x06, 0x14ee },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2022
		{ 0x06, 0x834e },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2023
		{ 0x06, 0x05d2 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2024
		{ 0x06, 0x40d6 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2025
		{ 0x06, 0x5554 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2026
		{ 0x06, 0x0282 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2027
		{ 0x06, 0x17d2 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2028
		{ 0x06, 0xa0d6 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2029
		{ 0x06, 0xba00 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2030
		{ 0x06, 0x0282 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2031
		{ 0x06, 0x17fe },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2032
		{ 0x06, 0xfdfc },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2033
		{ 0x06, 0x05f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2034
		{ 0x06, 0xe0f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2035
		{ 0x06, 0x60e1 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2036
		{ 0x06, 0xf861 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2037
		{ 0x06, 0x6802 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2038
		{ 0x06, 0xe4f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2039
		{ 0x06, 0x60e5 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2040
		{ 0x06, 0xf861 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2041
		{ 0x06, 0xe0f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2042
		{ 0x06, 0x48e1 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2043
		{ 0x06, 0xf849 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2044
		{ 0x06, 0x580f },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2045
		{ 0x06, 0x1e02 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2046
		{ 0x06, 0xe4f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2047
		{ 0x06, 0x48e5 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2048
		{ 0x06, 0xf849 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2049
		{ 0x06, 0xd000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2050
		{ 0x06, 0x0282 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2051
		{ 0x06, 0x5bbf },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2052
		{ 0x06, 0x8350 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2053
		{ 0x06, 0xef46 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2054
		{ 0x06, 0xdc19 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2055
		{ 0x06, 0xddd0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2056
		{ 0x06, 0x0102 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2057
		{ 0x06, 0x825b },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2058
		{ 0x06, 0x0282 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2059
		{ 0x06, 0x77e0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2060
		{ 0x06, 0xf860 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2061
		{ 0x06, 0xe1f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2062
		{ 0x06, 0x6158 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2063
		{ 0x06, 0xfde4 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2064
		{ 0x06, 0xf860 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2065
		{ 0x06, 0xe5f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2066
		{ 0x06, 0x61fc },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2067
		{ 0x06, 0x04f9 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2068
		{ 0x06, 0xfafb },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2069
		{ 0x06, 0xc6bf },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2070
		{ 0x06, 0xf840 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2071
		{ 0x06, 0xbe83 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2072
		{ 0x06, 0x50a0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2073
		{ 0x06, 0x0101 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2074
		{ 0x06, 0x071b },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2075
		{ 0x06, 0x89cf },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2076
		{ 0x06, 0xd208 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2077
		{ 0x06, 0xebdb },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2078
		{ 0x06, 0x19b2 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2079
		{ 0x06, 0xfbff },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2080
		{ 0x06, 0xfefd },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2081
		{ 0x06, 0x04f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2082
		{ 0x06, 0xe0f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2083
		{ 0x06, 0x48e1 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2084
		{ 0x06, 0xf849 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2085
		{ 0x06, 0x6808 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2086
		{ 0x06, 0xe4f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2087
		{ 0x06, 0x48e5 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2088
		{ 0x06, 0xf849 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2089
		{ 0x06, 0x58f7 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2090
		{ 0x06, 0xe4f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2091
		{ 0x06, 0x48e5 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2092
		{ 0x06, 0xf849 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2093
		{ 0x06, 0xfc04 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2094
		{ 0x06, 0x4d20 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2095
		{ 0x06, 0x0002 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2096
		{ 0x06, 0x4e22 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2097
		{ 0x06, 0x0002 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2098
		{ 0x06, 0x4ddf },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2099
		{ 0x06, 0xff01 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2100
		{ 0x06, 0x4edd },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2101
		{ 0x06, 0xff01 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2102
		{ 0x05, 0x83d4 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2103
		{ 0x06, 0x8000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2104
		{ 0x05, 0x83d8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2105
		{ 0x06, 0x8051 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2106
		{ 0x02, 0x6010 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2107
		{ 0x03, 0xdc00 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2108
		{ 0x05, 0xfff6 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2109
		{ 0x06, 0x00fc },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2110
		{ 0x1f, 0x0000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2111
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2112
		{ 0x1f, 0x0000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2113
		{ 0x0d, 0xf880 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2114
		{ 0x1f, 0x0000 }
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2115
	};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2116
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2117
	rtl_phy_write(ioaddr, phy_reg_init_0, ARRAY_SIZE(phy_reg_init_0));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2118
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2119
	mdio_write(ioaddr, 0x1f, 0x0002);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2120
	mdio_plus_minus(ioaddr, 0x0b, 0x0010, 0x00ef);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2121
	mdio_plus_minus(ioaddr, 0x0c, 0xa200, 0x5d00);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2122
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2123
	rtl_phy_write(ioaddr, phy_reg_init_1, ARRAY_SIZE(phy_reg_init_1));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2124
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2125
	if (rtl8168d_efuse_read(ioaddr, 0x01) == 0xb1) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2126
		static const struct phy_reg phy_reg_init[] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2127
			{ 0x1f, 0x0002 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2128
			{ 0x05, 0x669a },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2129
			{ 0x1f, 0x0005 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2130
			{ 0x05, 0x8330 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2131
			{ 0x06, 0x669a },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2132
			{ 0x1f, 0x0002 }
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2133
		};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2134
		int val;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2135
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2136
		rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2137
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2138
		val = mdio_read(ioaddr, 0x0d);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2139
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2140
		if ((val & 0x00ff) != 0x006c) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2141
			static const u32 set[] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2142
				0x0065, 0x0066, 0x0067, 0x0068,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2143
				0x0069, 0x006a, 0x006b, 0x006c
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2144
			};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2145
			int i;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2146
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2147
			mdio_write(ioaddr, 0x1f, 0x0002);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2148
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2149
			val &= 0xff00;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2150
			for (i = 0; i < ARRAY_SIZE(set); i++)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2151
				mdio_write(ioaddr, 0x0d, val | set[i]);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2152
		}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2153
	} else {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2154
		static const struct phy_reg phy_reg_init[] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2155
			{ 0x1f, 0x0002 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2156
			{ 0x05, 0x6662 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2157
			{ 0x1f, 0x0005 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2158
			{ 0x05, 0x8330 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2159
			{ 0x06, 0x6662 }
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2160
		};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2161
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2162
		rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2163
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2164
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2165
	mdio_write(ioaddr, 0x1f, 0x0002);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2166
	mdio_patch(ioaddr, 0x0d, 0x0300);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2167
	mdio_patch(ioaddr, 0x0f, 0x0010);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2168
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2169
	mdio_write(ioaddr, 0x1f, 0x0002);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2170
	mdio_plus_minus(ioaddr, 0x02, 0x0100, 0x0600);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2171
	mdio_plus_minus(ioaddr, 0x03, 0x0000, 0xe000);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2172
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2173
	rtl_phy_write(ioaddr, phy_reg_init_2, ARRAY_SIZE(phy_reg_init_2));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2174
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2175
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2176
static void rtl8168d_2_hw_phy_config(void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2177
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2178
	static const struct phy_reg phy_reg_init_0[] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2179
		{ 0x1f, 0x0001 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2180
		{ 0x06, 0x4064 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2181
		{ 0x07, 0x2863 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2182
		{ 0x08, 0x059c },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2183
		{ 0x09, 0x26b4 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2184
		{ 0x0a, 0x6a19 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2185
		{ 0x0b, 0xdcc8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2186
		{ 0x10, 0xf06d },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2187
		{ 0x14, 0x7f68 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2188
		{ 0x18, 0x7fd9 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2189
		{ 0x1c, 0xf0ff },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2190
		{ 0x1d, 0x3d9c },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2191
		{ 0x1f, 0x0003 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2192
		{ 0x12, 0xf49f },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2193
		{ 0x13, 0x070b },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2194
		{ 0x1a, 0x05ad },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2195
		{ 0x14, 0x94c0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2196
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2197
		{ 0x1f, 0x0002 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2198
		{ 0x06, 0x5561 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2199
		{ 0x1f, 0x0005 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2200
		{ 0x05, 0x8332 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2201
		{ 0x06, 0x5561 }
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2202
	};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2203
	static const struct phy_reg phy_reg_init_1[] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2204
		{ 0x1f, 0x0005 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2205
		{ 0x05, 0xffc2 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2206
		{ 0x1f, 0x0005 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2207
		{ 0x05, 0x8000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2208
		{ 0x06, 0xf8f9 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2209
		{ 0x06, 0xfaee },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2210
		{ 0x06, 0xf8ea },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2211
		{ 0x06, 0x00ee },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2212
		{ 0x06, 0xf8eb },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2213
		{ 0x06, 0x00e2 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2214
		{ 0x06, 0xf87c },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2215
		{ 0x06, 0xe3f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2216
		{ 0x06, 0x7da5 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2217
		{ 0x06, 0x1111 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2218
		{ 0x06, 0x12d2 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2219
		{ 0x06, 0x40d6 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2220
		{ 0x06, 0x4444 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2221
		{ 0x06, 0x0281 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2222
		{ 0x06, 0xc6d2 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2223
		{ 0x06, 0xa0d6 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2224
		{ 0x06, 0xaaaa },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2225
		{ 0x06, 0x0281 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2226
		{ 0x06, 0xc6ae },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2227
		{ 0x06, 0x0fa5 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2228
		{ 0x06, 0x4444 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2229
		{ 0x06, 0x02ae },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2230
		{ 0x06, 0x4da5 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2231
		{ 0x06, 0xaaaa },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2232
		{ 0x06, 0x02ae },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2233
		{ 0x06, 0x47af },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2234
		{ 0x06, 0x81c2 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2235
		{ 0x06, 0xee83 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2236
		{ 0x06, 0x4e00 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2237
		{ 0x06, 0xee83 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2238
		{ 0x06, 0x4d0f },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2239
		{ 0x06, 0xee83 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2240
		{ 0x06, 0x4c0f },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2241
		{ 0x06, 0xee83 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2242
		{ 0x06, 0x4f00 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2243
		{ 0x06, 0xee83 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2244
		{ 0x06, 0x5100 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2245
		{ 0x06, 0xee83 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2246
		{ 0x06, 0x4aff },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2247
		{ 0x06, 0xee83 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2248
		{ 0x06, 0x4bff },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2249
		{ 0x06, 0xe083 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2250
		{ 0x06, 0x30e1 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2251
		{ 0x06, 0x8331 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2252
		{ 0x06, 0x58fe },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2253
		{ 0x06, 0xe4f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2254
		{ 0x06, 0x8ae5 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2255
		{ 0x06, 0xf88b },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2256
		{ 0x06, 0xe083 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2257
		{ 0x06, 0x32e1 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2258
		{ 0x06, 0x8333 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2259
		{ 0x06, 0x590f },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2260
		{ 0x06, 0xe283 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2261
		{ 0x06, 0x4d0c },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2262
		{ 0x06, 0x245a },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2263
		{ 0x06, 0xf01e },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2264
		{ 0x06, 0x12e4 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2265
		{ 0x06, 0xf88c },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2266
		{ 0x06, 0xe5f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2267
		{ 0x06, 0x8daf },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2268
		{ 0x06, 0x81c2 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2269
		{ 0x06, 0xe083 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2270
		{ 0x06, 0x4f10 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2271
		{ 0x06, 0xe483 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2272
		{ 0x06, 0x4fe0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2273
		{ 0x06, 0x834e },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2274
		{ 0x06, 0x7800 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2275
		{ 0x06, 0x9f0a },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2276
		{ 0x06, 0xe083 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2277
		{ 0x06, 0x4fa0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2278
		{ 0x06, 0x10a5 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2279
		{ 0x06, 0xee83 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2280
		{ 0x06, 0x4e01 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2281
		{ 0x06, 0xe083 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2282
		{ 0x06, 0x4e78 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2283
		{ 0x06, 0x059e },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2284
		{ 0x06, 0x9ae0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2285
		{ 0x06, 0x834e },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2286
		{ 0x06, 0x7804 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2287
		{ 0x06, 0x9e10 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2288
		{ 0x06, 0xe083 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2289
		{ 0x06, 0x4e78 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2290
		{ 0x06, 0x039e },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2291
		{ 0x06, 0x0fe0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2292
		{ 0x06, 0x834e },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2293
		{ 0x06, 0x7801 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2294
		{ 0x06, 0x9e05 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2295
		{ 0x06, 0xae0c },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2296
		{ 0x06, 0xaf81 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2297
		{ 0x06, 0xa7af },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2298
		{ 0x06, 0x8152 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2299
		{ 0x06, 0xaf81 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2300
		{ 0x06, 0x8baf },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2301
		{ 0x06, 0x81c2 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2302
		{ 0x06, 0xee83 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2303
		{ 0x06, 0x4800 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2304
		{ 0x06, 0xee83 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2305
		{ 0x06, 0x4900 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2306
		{ 0x06, 0xe083 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2307
		{ 0x06, 0x5110 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2308
		{ 0x06, 0xe483 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2309
		{ 0x06, 0x5158 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2310
		{ 0x06, 0x019f },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2311
		{ 0x06, 0xead0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2312
		{ 0x06, 0x00d1 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2313
		{ 0x06, 0x801f },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2314
		{ 0x06, 0x66e2 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2315
		{ 0x06, 0xf8ea },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2316
		{ 0x06, 0xe3f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2317
		{ 0x06, 0xeb5a },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2318
		{ 0x06, 0xf81e },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2319
		{ 0x06, 0x20e6 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2320
		{ 0x06, 0xf8ea },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2321
		{ 0x06, 0xe5f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2322
		{ 0x06, 0xebd3 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2323
		{ 0x06, 0x02b3 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2324
		{ 0x06, 0xfee2 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2325
		{ 0x06, 0xf87c },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2326
		{ 0x06, 0xef32 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2327
		{ 0x06, 0x5b80 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2328
		{ 0x06, 0xe3f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2329
		{ 0x06, 0x7d9e },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2330
		{ 0x06, 0x037d },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2331
		{ 0x06, 0xffff },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2332
		{ 0x06, 0x0d58 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2333
		{ 0x06, 0x1c55 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2334
		{ 0x06, 0x1a65 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2335
		{ 0x06, 0x11a1 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2336
		{ 0x06, 0x90d3 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2337
		{ 0x06, 0xe283 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2338
		{ 0x06, 0x48e3 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2339
		{ 0x06, 0x8349 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2340
		{ 0x06, 0x1b56 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2341
		{ 0x06, 0xab08 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2342
		{ 0x06, 0xef56 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2343
		{ 0x06, 0xe683 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2344
		{ 0x06, 0x48e7 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2345
		{ 0x06, 0x8349 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2346
		{ 0x06, 0x10d1 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2347
		{ 0x06, 0x801f },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2348
		{ 0x06, 0x66a0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2349
		{ 0x06, 0x04b9 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2350
		{ 0x06, 0xe283 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2351
		{ 0x06, 0x48e3 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2352
		{ 0x06, 0x8349 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2353
		{ 0x06, 0xef65 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2354
		{ 0x06, 0xe283 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2355
		{ 0x06, 0x4ae3 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2356
		{ 0x06, 0x834b },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2357
		{ 0x06, 0x1b56 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2358
		{ 0x06, 0xaa0e },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2359
		{ 0x06, 0xef56 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2360
		{ 0x06, 0xe683 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2361
		{ 0x06, 0x4ae7 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2362
		{ 0x06, 0x834b },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2363
		{ 0x06, 0xe283 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2364
		{ 0x06, 0x4de6 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2365
		{ 0x06, 0x834c },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2366
		{ 0x06, 0xe083 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2367
		{ 0x06, 0x4da0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2368
		{ 0x06, 0x000c },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2369
		{ 0x06, 0xaf81 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2370
		{ 0x06, 0x8be0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2371
		{ 0x06, 0x834d },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2372
		{ 0x06, 0x10e4 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2373
		{ 0x06, 0x834d },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2374
		{ 0x06, 0xae04 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2375
		{ 0x06, 0x80e4 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2376
		{ 0x06, 0x834d },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2377
		{ 0x06, 0xe083 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2378
		{ 0x06, 0x4e78 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2379
		{ 0x06, 0x039e },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2380
		{ 0x06, 0x0be0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2381
		{ 0x06, 0x834e },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2382
		{ 0x06, 0x7804 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2383
		{ 0x06, 0x9e04 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2384
		{ 0x06, 0xee83 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2385
		{ 0x06, 0x4e02 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2386
		{ 0x06, 0xe083 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2387
		{ 0x06, 0x32e1 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2388
		{ 0x06, 0x8333 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2389
		{ 0x06, 0x590f },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2390
		{ 0x06, 0xe283 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2391
		{ 0x06, 0x4d0c },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2392
		{ 0x06, 0x245a },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2393
		{ 0x06, 0xf01e },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2394
		{ 0x06, 0x12e4 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2395
		{ 0x06, 0xf88c },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2396
		{ 0x06, 0xe5f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2397
		{ 0x06, 0x8de0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2398
		{ 0x06, 0x8330 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2399
		{ 0x06, 0xe183 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2400
		{ 0x06, 0x3168 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2401
		{ 0x06, 0x01e4 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2402
		{ 0x06, 0xf88a },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2403
		{ 0x06, 0xe5f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2404
		{ 0x06, 0x8bae },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2405
		{ 0x06, 0x37ee },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2406
		{ 0x06, 0x834e },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2407
		{ 0x06, 0x03e0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2408
		{ 0x06, 0x834c },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2409
		{ 0x06, 0xe183 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2410
		{ 0x06, 0x4d1b },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2411
		{ 0x06, 0x019e },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2412
		{ 0x06, 0x04aa },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2413
		{ 0x06, 0xa1ae },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2414
		{ 0x06, 0xa8ee },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2415
		{ 0x06, 0x834e },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2416
		{ 0x06, 0x04ee },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2417
		{ 0x06, 0x834f },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2418
		{ 0x06, 0x00ae },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2419
		{ 0x06, 0xabe0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2420
		{ 0x06, 0x834f },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2421
		{ 0x06, 0x7803 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2422
		{ 0x06, 0x9f14 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2423
		{ 0x06, 0xee83 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2424
		{ 0x06, 0x4e05 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2425
		{ 0x06, 0xd240 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2426
		{ 0x06, 0xd655 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2427
		{ 0x06, 0x5402 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2428
		{ 0x06, 0x81c6 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2429
		{ 0x06, 0xd2a0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2430
		{ 0x06, 0xd6ba },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2431
		{ 0x06, 0x0002 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2432
		{ 0x06, 0x81c6 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2433
		{ 0x06, 0xfefd },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2434
		{ 0x06, 0xfc05 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2435
		{ 0x06, 0xf8e0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2436
		{ 0x06, 0xf860 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2437
		{ 0x06, 0xe1f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2438
		{ 0x06, 0x6168 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2439
		{ 0x06, 0x02e4 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2440
		{ 0x06, 0xf860 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2441
		{ 0x06, 0xe5f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2442
		{ 0x06, 0x61e0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2443
		{ 0x06, 0xf848 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2444
		{ 0x06, 0xe1f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2445
		{ 0x06, 0x4958 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2446
		{ 0x06, 0x0f1e },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2447
		{ 0x06, 0x02e4 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2448
		{ 0x06, 0xf848 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2449
		{ 0x06, 0xe5f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2450
		{ 0x06, 0x49d0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2451
		{ 0x06, 0x0002 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2452
		{ 0x06, 0x820a },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2453
		{ 0x06, 0xbf83 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2454
		{ 0x06, 0x50ef },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2455
		{ 0x06, 0x46dc },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2456
		{ 0x06, 0x19dd },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2457
		{ 0x06, 0xd001 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2458
		{ 0x06, 0x0282 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2459
		{ 0x06, 0x0a02 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2460
		{ 0x06, 0x8226 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2461
		{ 0x06, 0xe0f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2462
		{ 0x06, 0x60e1 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2463
		{ 0x06, 0xf861 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2464
		{ 0x06, 0x58fd },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2465
		{ 0x06, 0xe4f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2466
		{ 0x06, 0x60e5 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2467
		{ 0x06, 0xf861 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2468
		{ 0x06, 0xfc04 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2469
		{ 0x06, 0xf9fa },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2470
		{ 0x06, 0xfbc6 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2471
		{ 0x06, 0xbff8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2472
		{ 0x06, 0x40be },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2473
		{ 0x06, 0x8350 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2474
		{ 0x06, 0xa001 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2475
		{ 0x06, 0x0107 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2476
		{ 0x06, 0x1b89 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2477
		{ 0x06, 0xcfd2 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2478
		{ 0x06, 0x08eb },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2479
		{ 0x06, 0xdb19 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2480
		{ 0x06, 0xb2fb },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2481
		{ 0x06, 0xfffe },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2482
		{ 0x06, 0xfd04 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2483
		{ 0x06, 0xf8e0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2484
		{ 0x06, 0xf848 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2485
		{ 0x06, 0xe1f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2486
		{ 0x06, 0x4968 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2487
		{ 0x06, 0x08e4 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2488
		{ 0x06, 0xf848 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2489
		{ 0x06, 0xe5f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2490
		{ 0x06, 0x4958 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2491
		{ 0x06, 0xf7e4 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2492
		{ 0x06, 0xf848 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2493
		{ 0x06, 0xe5f8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2494
		{ 0x06, 0x49fc },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2495
		{ 0x06, 0x044d },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2496
		{ 0x06, 0x2000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2497
		{ 0x06, 0x024e },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2498
		{ 0x06, 0x2200 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2499
		{ 0x06, 0x024d },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2500
		{ 0x06, 0xdfff },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2501
		{ 0x06, 0x014e },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2502
		{ 0x06, 0xddff },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2503
		{ 0x06, 0x0100 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2504
		{ 0x05, 0x83d8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2505
		{ 0x06, 0x8000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2506
		{ 0x03, 0xdc00 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2507
		{ 0x05, 0xfff6 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2508
		{ 0x06, 0x00fc },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2509
		{ 0x1f, 0x0000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2510
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2511
		{ 0x1f, 0x0000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2512
		{ 0x0d, 0xf880 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2513
		{ 0x1f, 0x0000 }
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2514
	};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2515
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2516
	rtl_phy_write(ioaddr, phy_reg_init_0, ARRAY_SIZE(phy_reg_init_0));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2517
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2518
	if (rtl8168d_efuse_read(ioaddr, 0x01) == 0xb1) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2519
		static const struct phy_reg phy_reg_init[] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2520
			{ 0x1f, 0x0002 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2521
			{ 0x05, 0x669a },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2522
			{ 0x1f, 0x0005 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2523
			{ 0x05, 0x8330 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2524
			{ 0x06, 0x669a },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2525
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2526
			{ 0x1f, 0x0002 }
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2527
		};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2528
		int val;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2529
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2530
		rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2531
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2532
		val = mdio_read(ioaddr, 0x0d);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2533
		if ((val & 0x00ff) != 0x006c) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2534
			u32 set[] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2535
				0x0065, 0x0066, 0x0067, 0x0068,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2536
				0x0069, 0x006a, 0x006b, 0x006c
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2537
			};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2538
			int i;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2539
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2540
			mdio_write(ioaddr, 0x1f, 0x0002);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2541
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2542
			val &= 0xff00;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2543
			for (i = 0; i < ARRAY_SIZE(set); i++)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2544
				mdio_write(ioaddr, 0x0d, val | set[i]);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2545
		}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2546
	} else {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2547
		static const struct phy_reg phy_reg_init[] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2548
			{ 0x1f, 0x0002 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2549
			{ 0x05, 0x2642 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2550
			{ 0x1f, 0x0005 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2551
			{ 0x05, 0x8330 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2552
			{ 0x06, 0x2642 }
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2553
		};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2554
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2555
		rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2556
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2557
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2558
	mdio_write(ioaddr, 0x1f, 0x0002);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2559
	mdio_plus_minus(ioaddr, 0x02, 0x0100, 0x0600);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2560
	mdio_plus_minus(ioaddr, 0x03, 0x0000, 0xe000);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2561
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2562
	mdio_write(ioaddr, 0x1f, 0x0001);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2563
	mdio_write(ioaddr, 0x17, 0x0cc0);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2564
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2565
	mdio_write(ioaddr, 0x1f, 0x0002);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2566
	mdio_patch(ioaddr, 0x0f, 0x0017);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2567
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2568
	rtl_phy_write(ioaddr, phy_reg_init_1, ARRAY_SIZE(phy_reg_init_1));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2569
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2570
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2571
static void rtl8168d_3_hw_phy_config(void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2572
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2573
	static const struct phy_reg phy_reg_init[] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2574
		{ 0x1f, 0x0002 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2575
		{ 0x10, 0x0008 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2576
		{ 0x0d, 0x006c },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2577
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2578
		{ 0x1f, 0x0000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2579
		{ 0x0d, 0xf880 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2580
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2581
		{ 0x1f, 0x0001 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2582
		{ 0x17, 0x0cc0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2583
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2584
		{ 0x1f, 0x0001 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2585
		{ 0x0b, 0xa4d8 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2586
		{ 0x09, 0x281c },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2587
		{ 0x07, 0x2883 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2588
		{ 0x0a, 0x6b35 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2589
		{ 0x1d, 0x3da4 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2590
		{ 0x1c, 0xeffd },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2591
		{ 0x14, 0x7f52 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2592
		{ 0x18, 0x7fc6 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2593
		{ 0x08, 0x0601 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2594
		{ 0x06, 0x4063 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2595
		{ 0x10, 0xf074 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2596
		{ 0x1f, 0x0003 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2597
		{ 0x13, 0x0789 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2598
		{ 0x12, 0xf4bd },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2599
		{ 0x1a, 0x04fd },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2600
		{ 0x14, 0x84b0 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2601
		{ 0x1f, 0x0000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2602
		{ 0x00, 0x9200 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2603
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2604
		{ 0x1f, 0x0005 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2605
		{ 0x01, 0x0340 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2606
		{ 0x1f, 0x0001 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2607
		{ 0x04, 0x4000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2608
		{ 0x03, 0x1d21 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2609
		{ 0x02, 0x0c32 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2610
		{ 0x01, 0x0200 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2611
		{ 0x00, 0x5554 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2612
		{ 0x04, 0x4800 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2613
		{ 0x04, 0x4000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2614
		{ 0x04, 0xf000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2615
		{ 0x03, 0xdf01 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2616
		{ 0x02, 0xdf20 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2617
		{ 0x01, 0x101a },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2618
		{ 0x00, 0xa0ff },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2619
		{ 0x04, 0xf800 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2620
		{ 0x04, 0xf000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2621
		{ 0x1f, 0x0000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2622
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2623
		{ 0x1f, 0x0007 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2624
		{ 0x1e, 0x0023 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2625
		{ 0x16, 0x0000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2626
		{ 0x1f, 0x0000 }
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2627
	};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2628
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2629
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2630
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2631
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2632
static void rtl8102e_hw_phy_config(void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2633
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2634
	static const struct phy_reg phy_reg_init[] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2635
		{ 0x1f, 0x0003 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2636
		{ 0x08, 0x441d },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2637
		{ 0x01, 0x9100 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2638
		{ 0x1f, 0x0000 }
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2639
	};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2640
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2641
	mdio_write(ioaddr, 0x1f, 0x0000);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2642
	mdio_patch(ioaddr, 0x11, 1 << 12);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2643
	mdio_patch(ioaddr, 0x19, 1 << 13);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2644
	mdio_patch(ioaddr, 0x10, 1 << 15);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2645
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2646
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2647
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2648
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2649
static void rtl_hw_phy_config(struct net_device *dev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2650
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2651
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2652
	void __iomem *ioaddr = tp->mmio_addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2653
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2654
	rtl8169_print_mac_version(tp);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2655
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2656
	switch (tp->mac_version) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2657
	case RTL_GIGA_MAC_VER_01:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2658
		break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2659
	case RTL_GIGA_MAC_VER_02:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2660
	case RTL_GIGA_MAC_VER_03:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2661
		rtl8169s_hw_phy_config(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2662
		break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2663
	case RTL_GIGA_MAC_VER_04:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2664
		rtl8169sb_hw_phy_config(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2665
		break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2666
	case RTL_GIGA_MAC_VER_05:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2667
		rtl8169scd_hw_phy_config(tp, ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2668
		break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2669
	case RTL_GIGA_MAC_VER_06:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2670
		rtl8169sce_hw_phy_config(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2671
		break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2672
	case RTL_GIGA_MAC_VER_07:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2673
	case RTL_GIGA_MAC_VER_08:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2674
	case RTL_GIGA_MAC_VER_09:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2675
		rtl8102e_hw_phy_config(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2676
		break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2677
	case RTL_GIGA_MAC_VER_11:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2678
		rtl8168bb_hw_phy_config(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2679
		break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2680
	case RTL_GIGA_MAC_VER_12:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2681
		rtl8168bef_hw_phy_config(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2682
		break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2683
	case RTL_GIGA_MAC_VER_17:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2684
		rtl8168bef_hw_phy_config(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2685
		break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2686
	case RTL_GIGA_MAC_VER_18:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2687
		rtl8168cp_1_hw_phy_config(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2688
		break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2689
	case RTL_GIGA_MAC_VER_19:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2690
		rtl8168c_1_hw_phy_config(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2691
		break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2692
	case RTL_GIGA_MAC_VER_20:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2693
		rtl8168c_2_hw_phy_config(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2694
		break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2695
	case RTL_GIGA_MAC_VER_21:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2696
		rtl8168c_3_hw_phy_config(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2697
		break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2698
	case RTL_GIGA_MAC_VER_22:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2699
		rtl8168c_4_hw_phy_config(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2700
		break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2701
	case RTL_GIGA_MAC_VER_23:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2702
	case RTL_GIGA_MAC_VER_24:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2703
		rtl8168cp_2_hw_phy_config(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2704
		break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2705
	case RTL_GIGA_MAC_VER_25:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2706
		rtl8168d_1_hw_phy_config(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2707
		break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2708
	case RTL_GIGA_MAC_VER_26:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2709
		rtl8168d_2_hw_phy_config(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2710
		break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2711
	case RTL_GIGA_MAC_VER_27:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2712
		rtl8168d_3_hw_phy_config(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2713
		break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2714
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2715
	default:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2716
		break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2717
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2718
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2719
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2720
static void rtl8169_phy_timer(unsigned long __opaque)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2721
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2722
	struct net_device *dev = (struct net_device *)__opaque;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2723
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2724
	struct timer_list *timer = &tp->timer;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2725
	void __iomem *ioaddr = tp->mmio_addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2726
	unsigned long timeout = RTL8169_PHY_TIMEOUT;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2727
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2728
	assert(tp->mac_version > RTL_GIGA_MAC_VER_01);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2729
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2730
	if (!(tp->phy_1000_ctrl_reg & ADVERTISE_1000FULL))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2731
		return;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2732
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2733
	if (!tp->ecdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2734
		spin_lock_irq(&tp->lock);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2735
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2736
	if (tp->phy_reset_pending(ioaddr)) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2737
		/*
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2738
		 * A busy loop could burn quite a few cycles on nowadays CPU.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2739
		 * Let's delay the execution of the timer for a few ticks.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2740
		 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2741
		timeout = HZ/10;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2742
		goto out_mod_timer;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2743
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2744
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2745
	if (tp->link_ok(ioaddr))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2746
		goto out_unlock;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2747
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2748
	netif_warn(tp, link, dev, "PHY reset until link up\n");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2749
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2750
	tp->phy_reset_enable(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2751
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2752
out_mod_timer:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2753
	if (!tp->ecdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2754
		mod_timer(timer, jiffies + timeout);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2755
out_unlock:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2756
	if (!tp->ecdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2757
		spin_unlock_irq(&tp->lock);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2758
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2759
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2760
static inline void rtl8169_delete_timer(struct net_device *dev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2761
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2762
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2763
	struct timer_list *timer = &tp->timer;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2764
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2765
	if (tp->ecdev || tp->mac_version <= RTL_GIGA_MAC_VER_01)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2766
		return;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2767
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2768
	del_timer_sync(timer);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2769
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2770
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2771
static inline void rtl8169_request_timer(struct net_device *dev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2772
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2773
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2774
	struct timer_list *timer = &tp->timer;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2775
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2776
	if (tp->ecdev || tp->mac_version <= RTL_GIGA_MAC_VER_01)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2777
		return;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2778
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2779
	mod_timer(timer, jiffies + RTL8169_PHY_TIMEOUT);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2780
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2781
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2782
#ifdef CONFIG_NET_POLL_CONTROLLER
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2783
/*
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2784
 * Polling 'interrupt' - used by things like netconsole to send skbs
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2785
 * without having to re-enable interrupts. It's not called while
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2786
 * the interrupt routine is executing.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2787
 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2788
static void rtl8169_netpoll(struct net_device *dev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2789
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2790
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2791
	struct pci_dev *pdev = tp->pci_dev;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2792
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2793
	disable_irq(pdev->irq);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2794
	rtl8169_interrupt(pdev->irq, dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2795
	enable_irq(pdev->irq);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2796
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2797
#endif
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2798
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2799
static void rtl8169_release_board(struct pci_dev *pdev, struct net_device *dev,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2800
				  void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2801
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2802
	iounmap(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2803
	pci_release_regions(pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2804
	pci_clear_mwi(pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2805
	pci_disable_device(pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2806
	free_netdev(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2807
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2808
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2809
static void rtl8169_phy_reset(struct net_device *dev,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2810
			      struct rtl8169_private *tp)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2811
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2812
	void __iomem *ioaddr = tp->mmio_addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2813
	unsigned int i;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2814
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2815
	tp->phy_reset_enable(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2816
	for (i = 0; i < 100; i++) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2817
		if (!tp->phy_reset_pending(ioaddr))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2818
			return;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2819
		msleep(1);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2820
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2821
	netif_err(tp, link, dev, "PHY reset failed\n");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2822
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2823
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2824
static void rtl8169_init_phy(struct net_device *dev, struct rtl8169_private *tp)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2825
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2826
	void __iomem *ioaddr = tp->mmio_addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2827
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2828
	rtl_hw_phy_config(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2829
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2830
	if (tp->mac_version <= RTL_GIGA_MAC_VER_06) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2831
		dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2832
		RTL_W8(0x82, 0x01);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2833
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2834
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2835
	pci_write_config_byte(tp->pci_dev, PCI_LATENCY_TIMER, 0x40);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2836
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2837
	if (tp->mac_version <= RTL_GIGA_MAC_VER_06)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2838
		pci_write_config_byte(tp->pci_dev, PCI_CACHE_LINE_SIZE, 0x08);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2839
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2840
	if (tp->mac_version == RTL_GIGA_MAC_VER_02) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2841
		dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2842
		RTL_W8(0x82, 0x01);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2843
		dprintk("Set PHY Reg 0x0bh = 0x00h\n");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2844
		mdio_write(ioaddr, 0x0b, 0x0000); //w 0x0b 15 0 0
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2845
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2846
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2847
	rtl8169_phy_reset(dev, tp);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2848
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2849
	/*
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2850
	 * rtl8169_set_speed_xmii takes good care of the Fast Ethernet
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2851
	 * only 8101. Don't panic.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2852
	 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2853
	rtl8169_set_speed(dev, AUTONEG_ENABLE, SPEED_1000, DUPLEX_FULL);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2854
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2855
	if (RTL_R8(PHYstatus) & TBI_Enable)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2856
		netif_info(tp, link, dev, "TBI auto-negotiating\n");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2857
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2858
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2859
static void rtl_rar_set(struct rtl8169_private *tp, u8 *addr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2860
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2861
	void __iomem *ioaddr = tp->mmio_addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2862
	u32 high;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2863
	u32 low;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2864
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2865
	low  = addr[0] | (addr[1] << 8) | (addr[2] << 16) | (addr[3] << 24);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2866
	high = addr[4] | (addr[5] << 8);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2867
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2868
	spin_lock_irq(&tp->lock);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2869
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2870
	RTL_W8(Cfg9346, Cfg9346_Unlock);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2871
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2872
	RTL_W32(MAC4, high);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2873
	RTL_R32(MAC4);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2874
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2875
	RTL_W32(MAC0, low);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2876
	RTL_R32(MAC0);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2877
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2878
	RTL_W8(Cfg9346, Cfg9346_Lock);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2879
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2880
	spin_unlock_irq(&tp->lock);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2881
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2882
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2883
static int rtl_set_mac_address(struct net_device *dev, void *p)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2884
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2885
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2886
	struct sockaddr *addr = p;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2887
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2888
	if (!is_valid_ether_addr(addr->sa_data))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2889
		return -EADDRNOTAVAIL;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2890
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2891
	memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2892
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2893
	rtl_rar_set(tp, dev->dev_addr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2894
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2895
	return 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2896
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2897
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2898
static int rtl8169_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2899
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2900
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2901
	struct mii_ioctl_data *data = if_mii(ifr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2902
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2903
	return netif_running(dev) ? tp->do_ioctl(tp, data, cmd) : -ENODEV;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2904
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2905
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2906
static int rtl_xmii_ioctl(struct rtl8169_private *tp, struct mii_ioctl_data *data, int cmd)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2907
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2908
	switch (cmd) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2909
	case SIOCGMIIPHY:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2910
		data->phy_id = 32; /* Internal PHY */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2911
		return 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2912
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2913
	case SIOCGMIIREG:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2914
		data->val_out = mdio_read(tp->mmio_addr, data->reg_num & 0x1f);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2915
		return 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2916
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2917
	case SIOCSMIIREG:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2918
		mdio_write(tp->mmio_addr, data->reg_num & 0x1f, data->val_in);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2919
		return 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2920
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2921
	return -EOPNOTSUPP;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2922
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2923
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2924
static int rtl_tbi_ioctl(struct rtl8169_private *tp, struct mii_ioctl_data *data, int cmd)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2925
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2926
	return -EOPNOTSUPP;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2927
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2928
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2929
static const struct rtl_cfg_info {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2930
	void (*hw_start)(struct net_device *);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2931
	unsigned int region;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2932
	unsigned int align;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2933
	u16 intr_event;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2934
	u16 napi_event;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2935
	unsigned features;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2936
	u8 default_ver;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2937
} rtl_cfg_infos [] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2938
	[RTL_CFG_0] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2939
		.hw_start	= rtl_hw_start_8169,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2940
		.region		= 1,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2941
		.align		= 0,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2942
		.intr_event	= SYSErr | LinkChg | RxOverflow |
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2943
				  RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2944
		.napi_event	= RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2945
		.features	= RTL_FEATURE_GMII,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2946
		.default_ver	= RTL_GIGA_MAC_VER_01,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2947
	},
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2948
	[RTL_CFG_1] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2949
		.hw_start	= rtl_hw_start_8168,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2950
		.region		= 2,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2951
		.align		= 8,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2952
		.intr_event	= SYSErr | LinkChg | RxOverflow |
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2953
				  TxErr | TxOK | RxOK | RxErr,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2954
		.napi_event	= TxErr | TxOK | RxOK | RxOverflow,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2955
		.features	= RTL_FEATURE_GMII | RTL_FEATURE_MSI,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2956
		.default_ver	= RTL_GIGA_MAC_VER_11,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2957
	},
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2958
	[RTL_CFG_2] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2959
		.hw_start	= rtl_hw_start_8101,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2960
		.region		= 2,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2961
		.align		= 8,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2962
		.intr_event	= SYSErr | LinkChg | RxOverflow | PCSTimeout |
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2963
				  RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2964
		.napi_event	= RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2965
		.features	= RTL_FEATURE_MSI,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2966
		.default_ver	= RTL_GIGA_MAC_VER_13,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2967
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2968
};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2969
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2970
/* Cfg9346_Unlock assumed. */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2971
static unsigned rtl_try_msi(struct pci_dev *pdev, void __iomem *ioaddr,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2972
			    const struct rtl_cfg_info *cfg)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2973
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2974
	unsigned msi = 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2975
	u8 cfg2;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2976
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2977
	cfg2 = RTL_R8(Config2) & ~MSIEnable;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2978
	if (cfg->features & RTL_FEATURE_MSI) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2979
		if (pci_enable_msi(pdev)) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2980
			dev_info(&pdev->dev, "no MSI. Back to INTx.\n");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2981
		} else {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2982
			cfg2 |= MSIEnable;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2983
			msi = RTL_FEATURE_MSI;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2984
		}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2985
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2986
	RTL_W8(Config2, cfg2);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2987
	return msi;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2988
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2989
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2990
static void rtl_disable_msi(struct pci_dev *pdev, struct rtl8169_private *tp)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2991
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2992
	if (tp->features & RTL_FEATURE_MSI) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2993
		pci_disable_msi(pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2994
		tp->features &= ~RTL_FEATURE_MSI;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2995
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2996
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2997
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2998
static const struct net_device_ops rtl8169_netdev_ops = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2999
	.ndo_open		= rtl8169_open,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3000
	.ndo_stop		= rtl8169_close,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3001
	.ndo_get_stats		= rtl8169_get_stats,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3002
	.ndo_start_xmit		= rtl8169_start_xmit,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3003
	.ndo_tx_timeout		= rtl8169_tx_timeout,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3004
	.ndo_validate_addr	= eth_validate_addr,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3005
	.ndo_change_mtu		= rtl8169_change_mtu,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3006
	.ndo_set_mac_address	= rtl_set_mac_address,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3007
	.ndo_do_ioctl		= rtl8169_ioctl,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3008
	.ndo_set_multicast_list	= rtl_set_rx_mode,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3009
#ifdef CONFIG_R8169_VLAN
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3010
	.ndo_vlan_rx_register	= rtl8169_vlan_rx_register,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3011
#endif
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3012
#ifdef CONFIG_NET_POLL_CONTROLLER
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3013
	.ndo_poll_controller	= rtl8169_netpoll,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3014
#endif
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3015
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3016
};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3017
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3018
static int __devinit
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3019
rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3020
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3021
	const struct rtl_cfg_info *cfg = rtl_cfg_infos + ent->driver_data;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3022
	const unsigned int region = cfg->region;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3023
	struct rtl8169_private *tp;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3024
	struct mii_if_info *mii;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3025
	struct net_device *dev;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3026
	void __iomem *ioaddr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3027
	unsigned int i;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3028
	int rc;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3029
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3030
	if (netif_msg_drv(&debug)) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3031
		printk(KERN_INFO "%s Gigabit Ethernet driver %s loaded\n",
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3032
		       MODULENAME, RTL8169_VERSION);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3033
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3034
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3035
	dev = alloc_etherdev(sizeof (*tp));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3036
	if (!dev) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3037
		if (netif_msg_drv(&debug))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3038
			dev_err(&pdev->dev, "unable to alloc new ethernet\n");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3039
		rc = -ENOMEM;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3040
		goto out;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3041
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3042
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3043
	SET_NETDEV_DEV(dev, &pdev->dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3044
	dev->netdev_ops = &rtl8169_netdev_ops;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3045
	tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3046
	tp->dev = dev;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3047
	tp->pci_dev = pdev;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3048
	tp->msg_enable = netif_msg_init(debug.msg_enable, R8169_MSG_DEFAULT);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3049
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3050
	mii = &tp->mii;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3051
	mii->dev = dev;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3052
	mii->mdio_read = rtl_mdio_read;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3053
	mii->mdio_write = rtl_mdio_write;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3054
	mii->phy_id_mask = 0x1f;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3055
	mii->reg_num_mask = 0x1f;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3056
	mii->supports_gmii = !!(cfg->features & RTL_FEATURE_GMII);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3057
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3058
	/* enable device (incl. PCI PM wakeup and hotplug setup) */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3059
	rc = pci_enable_device(pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3060
	if (rc < 0) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3061
		netif_err(tp, probe, dev, "enable failure\n");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3062
		goto err_out_free_dev_1;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3063
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3064
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3065
	if (pci_set_mwi(pdev) < 0)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3066
		netif_info(tp, probe, dev, "Mem-Wr-Inval unavailable\n");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3067
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3068
	/* make sure PCI base addr 1 is MMIO */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3069
	if (!(pci_resource_flags(pdev, region) & IORESOURCE_MEM)) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3070
		netif_err(tp, probe, dev,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3071
			  "region #%d not an MMIO resource, aborting\n",
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3072
			  region);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3073
		rc = -ENODEV;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3074
		goto err_out_mwi_2;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3075
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3076
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3077
	/* check for weird/broken PCI region reporting */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3078
	if (pci_resource_len(pdev, region) < R8169_REGS_SIZE) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3079
		netif_err(tp, probe, dev,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3080
			  "Invalid PCI region size(s), aborting\n");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3081
		rc = -ENODEV;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3082
		goto err_out_mwi_2;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3083
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3084
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3085
	rc = pci_request_regions(pdev, MODULENAME);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3086
	if (rc < 0) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3087
		netif_err(tp, probe, dev, "could not request regions\n");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3088
		goto err_out_mwi_2;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3089
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3090
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3091
	tp->cp_cmd = PCIMulRW | RxChkSum;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3092
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3093
	if ((sizeof(dma_addr_t) > 4) &&
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3094
	    !pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) && use_dac) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3095
		tp->cp_cmd |= PCIDAC;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3096
		dev->features |= NETIF_F_HIGHDMA;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3097
	} else {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3098
		rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3099
		if (rc < 0) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3100
			netif_err(tp, probe, dev, "DMA configuration failed\n");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3101
			goto err_out_free_res_3;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3102
		}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3103
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3104
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3105
	/* ioremap MMIO region */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3106
	ioaddr = ioremap(pci_resource_start(pdev, region), R8169_REGS_SIZE);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3107
	if (!ioaddr) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3108
		netif_err(tp, probe, dev, "cannot remap MMIO, aborting\n");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3109
		rc = -EIO;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3110
		goto err_out_free_res_3;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3111
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3112
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3113
	tp->pcie_cap = pci_find_capability(pdev, PCI_CAP_ID_EXP);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3114
	if (!tp->pcie_cap)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3115
		netif_info(tp, probe, dev, "no PCI Express capability\n");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3116
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3117
	RTL_W16(IntrMask, 0x0000);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3118
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3119
	/* Soft reset the chip. */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3120
	RTL_W8(ChipCmd, CmdReset);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3121
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3122
	/* Check that the chip has finished the reset. */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3123
	for (i = 0; i < 100; i++) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3124
		if ((RTL_R8(ChipCmd) & CmdReset) == 0)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3125
			break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3126
		msleep_interruptible(1);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3127
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3128
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3129
	RTL_W16(IntrStatus, 0xffff);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3130
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3131
	pci_set_master(pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3132
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3133
	/* Identify chip attached to board */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3134
	rtl8169_get_mac_version(tp, ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3135
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3136
	/* Use appropriate default if unknown */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3137
	if (tp->mac_version == RTL_GIGA_MAC_NONE) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3138
		netif_notice(tp, probe, dev,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3139
			     "unknown MAC, using family default\n");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3140
		tp->mac_version = cfg->default_ver;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3141
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3142
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3143
	rtl8169_print_mac_version(tp);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3144
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3145
	for (i = 0; i < ARRAY_SIZE(rtl_chip_info); i++) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3146
		if (tp->mac_version == rtl_chip_info[i].mac_version)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3147
			break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3148
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3149
	if (i == ARRAY_SIZE(rtl_chip_info)) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3150
		dev_err(&pdev->dev,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3151
			"driver bug, MAC version not found in rtl_chip_info\n");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3152
		goto err_out_msi_4;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3153
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3154
	tp->chipset = i;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3155
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3156
	RTL_W8(Cfg9346, Cfg9346_Unlock);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3157
	RTL_W8(Config1, RTL_R8(Config1) | PMEnable);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3158
	RTL_W8(Config5, RTL_R8(Config5) & PMEStatus);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3159
	if ((RTL_R8(Config3) & (LinkUp | MagicPacket)) != 0)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3160
		tp->features |= RTL_FEATURE_WOL;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3161
	if ((RTL_R8(Config5) & (UWF | BWF | MWF)) != 0)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3162
		tp->features |= RTL_FEATURE_WOL;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3163
	tp->features |= rtl_try_msi(pdev, ioaddr, cfg);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3164
	RTL_W8(Cfg9346, Cfg9346_Lock);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3165
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3166
	if ((tp->mac_version <= RTL_GIGA_MAC_VER_06) &&
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3167
	    (RTL_R8(PHYstatus) & TBI_Enable)) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3168
		tp->set_speed = rtl8169_set_speed_tbi;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3169
		tp->get_settings = rtl8169_gset_tbi;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3170
		tp->phy_reset_enable = rtl8169_tbi_reset_enable;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3171
		tp->phy_reset_pending = rtl8169_tbi_reset_pending;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3172
		tp->link_ok = rtl8169_tbi_link_ok;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3173
		tp->do_ioctl = rtl_tbi_ioctl;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3174
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3175
		tp->phy_1000_ctrl_reg = ADVERTISE_1000FULL; /* Implied by TBI */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3176
	} else {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3177
		tp->set_speed = rtl8169_set_speed_xmii;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3178
		tp->get_settings = rtl8169_gset_xmii;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3179
		tp->phy_reset_enable = rtl8169_xmii_reset_enable;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3180
		tp->phy_reset_pending = rtl8169_xmii_reset_pending;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3181
		tp->link_ok = rtl8169_xmii_link_ok;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3182
		tp->do_ioctl = rtl_xmii_ioctl;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3183
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3184
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3185
	spin_lock_init(&tp->lock);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3186
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3187
	tp->mmio_addr = ioaddr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3188
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3189
	/* Get MAC address */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3190
	for (i = 0; i < MAC_ADDR_LEN; i++)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3191
		dev->dev_addr[i] = RTL_R8(MAC0 + i);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3192
	memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3193
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3194
	SET_ETHTOOL_OPS(dev, &rtl8169_ethtool_ops);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3195
	dev->watchdog_timeo = RTL8169_TX_TIMEOUT;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3196
	dev->irq = pdev->irq;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3197
	dev->base_addr = (unsigned long) ioaddr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3198
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3199
	netif_napi_add(dev, &tp->napi, rtl8169_poll, R8169_NAPI_WEIGHT);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3200
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3201
#ifdef CONFIG_R8169_VLAN
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3202
	dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3203
#endif
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3204
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3205
	tp->intr_mask = 0xffff;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3206
	tp->align = cfg->align;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3207
	tp->hw_start = cfg->hw_start;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3208
	tp->intr_event = cfg->intr_event;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3209
	tp->napi_event = cfg->napi_event;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3210
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3211
	init_timer(&tp->timer);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3212
	tp->timer.data = (unsigned long) dev;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3213
	tp->timer.function = rtl8169_phy_timer;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3214
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3215
	// offer device to EtherCAT master module
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3216
	tp->ecdev = ecdev_offer(dev, ec_poll, THIS_MODULE);
2278
116355beeea5 Fixed opening device.
Florian Pose <fp@igh-essen.com>
parents: 2277
diff changeset
  3217
	tp->ec_watchdog_jiffies = jiffies;
2277
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3218
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3219
	if (!tp->ecdev) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3220
		rc = register_netdev(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3221
		if (rc < 0)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3222
			goto err_out_msi_4;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3223
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3224
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3225
	pci_set_drvdata(pdev, dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3226
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3227
	netif_info(tp, probe, dev, "%s at 0x%lx, %pM, XID %08x IRQ %d\n",
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3228
		   rtl_chip_info[tp->chipset].name,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3229
		   dev->base_addr, dev->dev_addr,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3230
		   (u32)(RTL_R32(TxConfig) & 0x9cf0f8ff), dev->irq);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3231
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3232
	rtl8169_init_phy(dev, tp);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3233
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3234
	/*
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3235
	 * Pretend we are using VLANs; This bypasses a nasty bug where
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3236
	 * Interrupts stop flowing on high load on 8110SCd controllers.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3237
	 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3238
	if (tp->mac_version == RTL_GIGA_MAC_VER_05)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3239
		RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) | RxVlan);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3240
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3241
	device_set_wakeup_enable(&pdev->dev, tp->features & RTL_FEATURE_WOL);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3242
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3243
	if (pci_dev_run_wake(pdev)) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3244
		pm_runtime_set_active(&pdev->dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3245
		pm_runtime_enable(&pdev->dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3246
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3247
	pm_runtime_idle(&pdev->dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3248
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2278
diff changeset
  3249
	if (tp->ecdev) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2278
diff changeset
  3250
		rc = ecdev_open(tp->ecdev);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2278
diff changeset
  3251
		if (rc) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2278
diff changeset
  3252
			ecdev_withdraw(tp->ecdev);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2278
diff changeset
  3253
			goto err_out_msi_4;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2278
diff changeset
  3254
		}
2278
116355beeea5 Fixed opening device.
Florian Pose <fp@igh-essen.com>
parents: 2277
diff changeset
  3255
	}
116355beeea5 Fixed opening device.
Florian Pose <fp@igh-essen.com>
parents: 2277
diff changeset
  3256
2277
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3257
out:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3258
	return rc;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3259
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3260
err_out_msi_4:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3261
	rtl_disable_msi(pdev, tp);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3262
	iounmap(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3263
err_out_free_res_3:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3264
	pci_release_regions(pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3265
err_out_mwi_2:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3266
	pci_clear_mwi(pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3267
	pci_disable_device(pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3268
err_out_free_dev_1:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3269
	free_netdev(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3270
	goto out;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3271
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3272
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3273
static void __devexit rtl8169_remove_one(struct pci_dev *pdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3274
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3275
	struct net_device *dev = pci_get_drvdata(pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3276
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3277
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3278
	pm_runtime_get_sync(&pdev->dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3279
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3280
	flush_scheduled_work();
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3281
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3282
	if (tp->ecdev) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3283
		ecdev_close(tp->ecdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3284
		ecdev_withdraw(tp->ecdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3285
	} else {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3286
		unregister_netdev(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3287
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3288
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3289
	if (pci_dev_run_wake(pdev)) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3290
		pm_runtime_disable(&pdev->dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3291
		pm_runtime_set_suspended(&pdev->dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3292
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3293
	pm_runtime_put_noidle(&pdev->dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3294
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3295
	/* restore original MAC address */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3296
	rtl_rar_set(tp, dev->perm_addr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3297
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3298
	rtl_disable_msi(pdev, tp);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3299
	rtl8169_release_board(pdev, dev, tp->mmio_addr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3300
	pci_set_drvdata(pdev, NULL);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3301
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3302
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3303
static void rtl8169_set_rxbufsize(struct rtl8169_private *tp,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3304
				  unsigned int mtu)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3305
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3306
	unsigned int max_frame = mtu + VLAN_ETH_HLEN + ETH_FCS_LEN;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3307
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3308
	if (max_frame != 16383)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3309
		printk(KERN_WARNING PFX "WARNING! Changing of MTU on this "
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3310
			"NIC may lead to frame reception errors!\n");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3311
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3312
	tp->rx_buf_sz = (max_frame > RX_BUF_SIZE) ? max_frame : RX_BUF_SIZE;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3313
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3314
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3315
static int rtl8169_open(struct net_device *dev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3316
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3317
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3318
	struct pci_dev *pdev = tp->pci_dev;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3319
	int retval = -ENOMEM;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3320
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3321
	pm_runtime_get_sync(&pdev->dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3322
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3323
	/*
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3324
	 * Note that we use a magic value here, its wierd I know
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3325
	 * its done because, some subset of rtl8169 hardware suffers from
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3326
	 * a problem in which frames received that are longer than
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3327
	 * the size set in RxMaxSize register return garbage sizes
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3328
	 * when received.  To avoid this we need to turn off filtering,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3329
	 * which is done by setting a value of 16383 in the RxMaxSize register
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3330
	 * and allocating 16k frames to handle the largest possible rx value
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3331
	 * thats what the magic math below does.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3332
	 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3333
	rtl8169_set_rxbufsize(tp, 16383 - VLAN_ETH_HLEN - ETH_FCS_LEN);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3334
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3335
	/*
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3336
	 * Rx and Tx desscriptors needs 256 bytes alignment.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3337
	 * pci_alloc_consistent provides more.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3338
	 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3339
	tp->TxDescArray = pci_alloc_consistent(pdev, R8169_TX_RING_BYTES,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3340
					       &tp->TxPhyAddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3341
	if (!tp->TxDescArray)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3342
		goto err_pm_runtime_put;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3343
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3344
	tp->RxDescArray = pci_alloc_consistent(pdev, R8169_RX_RING_BYTES,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3345
					       &tp->RxPhyAddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3346
	if (!tp->RxDescArray)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3347
		goto err_free_tx_0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3348
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3349
	retval = rtl8169_init_ring(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3350
	if (retval < 0)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3351
		goto err_free_rx_1;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3352
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3353
	INIT_DELAYED_WORK(&tp->task, NULL);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3354
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3355
	smp_mb();
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3356
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3357
	if (!tp->ecdev) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3358
		retval = request_irq(dev->irq, rtl8169_interrupt,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3359
				(tp->features & RTL_FEATURE_MSI) ? 0 : IRQF_SHARED,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3360
				dev->name, dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3361
		if (retval < 0)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3362
			goto err_release_ring_2;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3363
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3364
		napi_enable(&tp->napi);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3365
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3366
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3367
	rtl_hw_start(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3368
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3369
	rtl8169_request_timer(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3370
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3371
	tp->saved_wolopts = 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3372
	pm_runtime_put_noidle(&pdev->dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3373
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3374
	rtl8169_check_link_status(dev, tp, tp->mmio_addr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3375
out:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3376
	return retval;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3377
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3378
err_release_ring_2:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3379
	rtl8169_rx_clear(tp);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3380
err_free_rx_1:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3381
	pci_free_consistent(pdev, R8169_RX_RING_BYTES, tp->RxDescArray,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3382
			    tp->RxPhyAddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3383
	tp->RxDescArray = NULL;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3384
err_free_tx_0:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3385
	pci_free_consistent(pdev, R8169_TX_RING_BYTES, tp->TxDescArray,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3386
			    tp->TxPhyAddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3387
	tp->TxDescArray = NULL;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3388
err_pm_runtime_put:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3389
	pm_runtime_put_noidle(&pdev->dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3390
	goto out;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3391
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3392
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3393
static void rtl8169_hw_reset(void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3394
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3395
	/* Disable interrupts */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3396
	rtl8169_irq_mask_and_ack(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3397
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3398
	/* Reset the chipset */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3399
	RTL_W8(ChipCmd, CmdReset);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3400
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3401
	/* PCI commit */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3402
	RTL_R8(ChipCmd);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3403
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3404
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3405
static void rtl_set_rx_tx_config_registers(struct rtl8169_private *tp)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3406
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3407
	void __iomem *ioaddr = tp->mmio_addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3408
	u32 cfg = rtl8169_rx_config;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3409
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3410
	cfg |= (RTL_R32(RxConfig) & rtl_chip_info[tp->chipset].RxConfigMask);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3411
	RTL_W32(RxConfig, cfg);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3412
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3413
	/* Set DMA burst size and Interframe Gap Time */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3414
	RTL_W32(TxConfig, (TX_DMA_BURST << TxDMAShift) |
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3415
		(InterFrameGap << TxInterFrameGapShift));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3416
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3417
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3418
static void rtl_hw_start(struct net_device *dev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3419
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3420
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3421
	void __iomem *ioaddr = tp->mmio_addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3422
	unsigned int i;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3423
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3424
	/* Soft reset the chip. */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3425
	RTL_W8(ChipCmd, CmdReset);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3426
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3427
	/* Check that the chip has finished the reset. */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3428
	for (i = 0; i < 100; i++) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3429
		if ((RTL_R8(ChipCmd) & CmdReset) == 0)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3430
			break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3431
		msleep_interruptible(1);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3432
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3433
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3434
	tp->hw_start(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3435
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3436
	if (!tp->ecdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3437
		netif_start_queue(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3438
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3439
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3440
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3441
static void rtl_set_rx_tx_desc_registers(struct rtl8169_private *tp,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3442
					 void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3443
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3444
	/*
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3445
	 * Magic spell: some iop3xx ARM board needs the TxDescAddrHigh
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3446
	 * register to be written before TxDescAddrLow to work.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3447
	 * Switching from MMIO to I/O access fixes the issue as well.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3448
	 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3449
	RTL_W32(TxDescStartAddrHigh, ((u64) tp->TxPhyAddr) >> 32);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3450
	RTL_W32(TxDescStartAddrLow, ((u64) tp->TxPhyAddr) & DMA_BIT_MASK(32));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3451
	RTL_W32(RxDescAddrHigh, ((u64) tp->RxPhyAddr) >> 32);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3452
	RTL_W32(RxDescAddrLow, ((u64) tp->RxPhyAddr) & DMA_BIT_MASK(32));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3453
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3454
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3455
static u16 rtl_rw_cpluscmd(void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3456
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3457
	u16 cmd;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3458
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3459
	cmd = RTL_R16(CPlusCmd);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3460
	RTL_W16(CPlusCmd, cmd);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3461
	return cmd;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3462
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3463
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3464
static void rtl_set_rx_max_size(void __iomem *ioaddr, unsigned int rx_buf_sz)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3465
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3466
	/* Low hurts. Let's disable the filtering. */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3467
	RTL_W16(RxMaxSize, rx_buf_sz + 1);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3468
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3469
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3470
static void rtl8169_set_magic_reg(void __iomem *ioaddr, unsigned mac_version)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3471
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3472
	static const struct {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3473
		u32 mac_version;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3474
		u32 clk;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3475
		u32 val;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3476
	} cfg2_info [] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3477
		{ RTL_GIGA_MAC_VER_05, PCI_Clock_33MHz, 0x000fff00 }, // 8110SCd
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3478
		{ RTL_GIGA_MAC_VER_05, PCI_Clock_66MHz, 0x000fffff },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3479
		{ RTL_GIGA_MAC_VER_06, PCI_Clock_33MHz, 0x00ffff00 }, // 8110SCe
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3480
		{ RTL_GIGA_MAC_VER_06, PCI_Clock_66MHz, 0x00ffffff }
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3481
	}, *p = cfg2_info;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3482
	unsigned int i;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3483
	u32 clk;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3484
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3485
	clk = RTL_R8(Config2) & PCI_Clock_66MHz;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3486
	for (i = 0; i < ARRAY_SIZE(cfg2_info); i++, p++) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3487
		if ((p->mac_version == mac_version) && (p->clk == clk)) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3488
			RTL_W32(0x7c, p->val);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3489
			break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3490
		}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3491
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3492
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3493
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3494
static void rtl_hw_start_8169(struct net_device *dev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3495
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3496
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3497
	void __iomem *ioaddr = tp->mmio_addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3498
	struct pci_dev *pdev = tp->pci_dev;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3499
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3500
	if (tp->mac_version == RTL_GIGA_MAC_VER_05) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3501
		RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) | PCIMulRW);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3502
		pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, 0x08);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3503
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3504
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3505
	RTL_W8(Cfg9346, Cfg9346_Unlock);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3506
	if ((tp->mac_version == RTL_GIGA_MAC_VER_01) ||
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3507
	    (tp->mac_version == RTL_GIGA_MAC_VER_02) ||
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3508
	    (tp->mac_version == RTL_GIGA_MAC_VER_03) ||
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3509
	    (tp->mac_version == RTL_GIGA_MAC_VER_04))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3510
		RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3511
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3512
	RTL_W8(EarlyTxThres, EarlyTxThld);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3513
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3514
	rtl_set_rx_max_size(ioaddr, tp->rx_buf_sz);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3515
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3516
	if ((tp->mac_version == RTL_GIGA_MAC_VER_01) ||
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3517
	    (tp->mac_version == RTL_GIGA_MAC_VER_02) ||
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3518
	    (tp->mac_version == RTL_GIGA_MAC_VER_03) ||
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3519
	    (tp->mac_version == RTL_GIGA_MAC_VER_04))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3520
		rtl_set_rx_tx_config_registers(tp);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3521
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3522
	tp->cp_cmd |= rtl_rw_cpluscmd(ioaddr) | PCIMulRW;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3523
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3524
	if ((tp->mac_version == RTL_GIGA_MAC_VER_02) ||
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3525
	    (tp->mac_version == RTL_GIGA_MAC_VER_03)) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3526
		dprintk("Set MAC Reg C+CR Offset 0xE0. "
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3527
			"Bit-3 and bit-14 MUST be 1\n");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3528
		tp->cp_cmd |= (1 << 14);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3529
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3530
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3531
	RTL_W16(CPlusCmd, tp->cp_cmd);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3532
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3533
	rtl8169_set_magic_reg(ioaddr, tp->mac_version);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3534
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3535
	/*
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3536
	 * Undocumented corner. Supposedly:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3537
	 * (TxTimer << 12) | (TxPackets << 8) | (RxTimer << 4) | RxPackets
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3538
	 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3539
	RTL_W16(IntrMitigate, 0x0000);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3540
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3541
	rtl_set_rx_tx_desc_registers(tp, ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3542
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3543
	if ((tp->mac_version != RTL_GIGA_MAC_VER_01) &&
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3544
	    (tp->mac_version != RTL_GIGA_MAC_VER_02) &&
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3545
	    (tp->mac_version != RTL_GIGA_MAC_VER_03) &&
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3546
	    (tp->mac_version != RTL_GIGA_MAC_VER_04)) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3547
		RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3548
		rtl_set_rx_tx_config_registers(tp);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3549
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3550
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3551
	RTL_W8(Cfg9346, Cfg9346_Lock);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3552
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3553
	/* Initially a 10 us delay. Turned it into a PCI commit. - FR */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3554
	RTL_R8(IntrMask);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3555
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3556
	RTL_W32(RxMissed, 0);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3557
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3558
	rtl_set_rx_mode(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3559
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3560
	/* no early-rx interrupts */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3561
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xF000);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3562
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3563
	/* Enable all known interrupts by setting the interrupt mask. */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3564
	if (!tp->ecdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3565
		RTL_W16(IntrMask, tp->intr_event);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3566
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3567
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3568
static void rtl_tx_performance_tweak(struct pci_dev *pdev, u16 force)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3569
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3570
	struct net_device *dev = pci_get_drvdata(pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3571
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3572
	int cap = tp->pcie_cap;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3573
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3574
	if (cap) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3575
		u16 ctl;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3576
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3577
		pci_read_config_word(pdev, cap + PCI_EXP_DEVCTL, &ctl);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3578
		ctl = (ctl & ~PCI_EXP_DEVCTL_READRQ) | force;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3579
		pci_write_config_word(pdev, cap + PCI_EXP_DEVCTL, ctl);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3580
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3581
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3582
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3583
static void rtl_csi_access_enable(void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3584
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3585
	u32 csi;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3586
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3587
	csi = rtl_csi_read(ioaddr, 0x070c) & 0x00ffffff;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3588
	rtl_csi_write(ioaddr, 0x070c, csi | 0x27000000);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3589
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3590
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3591
struct ephy_info {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3592
	unsigned int offset;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3593
	u16 mask;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3594
	u16 bits;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3595
};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3596
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3597
static void rtl_ephy_init(void __iomem *ioaddr, const struct ephy_info *e, int len)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3598
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3599
	u16 w;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3600
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3601
	while (len-- > 0) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3602
		w = (rtl_ephy_read(ioaddr, e->offset) & ~e->mask) | e->bits;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3603
		rtl_ephy_write(ioaddr, e->offset, w);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3604
		e++;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3605
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3606
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3607
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3608
static void rtl_disable_clock_request(struct pci_dev *pdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3609
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3610
	struct net_device *dev = pci_get_drvdata(pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3611
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3612
	int cap = tp->pcie_cap;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3613
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3614
	if (cap) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3615
		u16 ctl;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3616
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3617
		pci_read_config_word(pdev, cap + PCI_EXP_LNKCTL, &ctl);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3618
		ctl &= ~PCI_EXP_LNKCTL_CLKREQ_EN;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3619
		pci_write_config_word(pdev, cap + PCI_EXP_LNKCTL, ctl);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3620
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3621
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3622
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3623
#define R8168_CPCMD_QUIRK_MASK (\
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3624
	EnableBist | \
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3625
	Mac_dbgo_oe | \
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3626
	Force_half_dup | \
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3627
	Force_rxflow_en | \
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3628
	Force_txflow_en | \
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3629
	Cxpl_dbg_sel | \
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3630
	ASF | \
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3631
	PktCntrDisable | \
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3632
	Mac_dbgo_sel)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3633
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3634
static void rtl_hw_start_8168bb(void __iomem *ioaddr, struct pci_dev *pdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3635
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3636
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3637
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3638
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3639
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3640
	rtl_tx_performance_tweak(pdev,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3641
		(0x5 << MAX_READ_REQUEST_SHIFT) | PCI_EXP_DEVCTL_NOSNOOP_EN);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3642
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3643
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3644
static void rtl_hw_start_8168bef(void __iomem *ioaddr, struct pci_dev *pdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3645
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3646
	rtl_hw_start_8168bb(ioaddr, pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3647
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3648
	RTL_W8(EarlyTxThres, EarlyTxThld);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3649
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3650
	RTL_W8(Config4, RTL_R8(Config4) & ~(1 << 0));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3651
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3652
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3653
static void __rtl_hw_start_8168cp(void __iomem *ioaddr, struct pci_dev *pdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3654
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3655
	RTL_W8(Config1, RTL_R8(Config1) | Speed_down);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3656
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3657
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3658
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3659
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3660
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3661
	rtl_disable_clock_request(pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3662
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3663
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3664
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3665
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3666
static void rtl_hw_start_8168cp_1(void __iomem *ioaddr, struct pci_dev *pdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3667
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3668
	static const struct ephy_info e_info_8168cp[] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3669
		{ 0x01, 0,	0x0001 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3670
		{ 0x02, 0x0800,	0x1000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3671
		{ 0x03, 0,	0x0042 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3672
		{ 0x06, 0x0080,	0x0000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3673
		{ 0x07, 0,	0x2000 }
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3674
	};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3675
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3676
	rtl_csi_access_enable(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3677
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3678
	rtl_ephy_init(ioaddr, e_info_8168cp, ARRAY_SIZE(e_info_8168cp));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3679
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3680
	__rtl_hw_start_8168cp(ioaddr, pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3681
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3682
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3683
static void rtl_hw_start_8168cp_2(void __iomem *ioaddr, struct pci_dev *pdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3684
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3685
	rtl_csi_access_enable(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3686
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3687
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3688
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3689
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3690
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3691
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3692
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3693
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3694
static void rtl_hw_start_8168cp_3(void __iomem *ioaddr, struct pci_dev *pdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3695
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3696
	rtl_csi_access_enable(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3697
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3698
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3699
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3700
	/* Magic. */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3701
	RTL_W8(DBG_REG, 0x20);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3702
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3703
	RTL_W8(EarlyTxThres, EarlyTxThld);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3704
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3705
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3706
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3707
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3708
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3709
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3710
static void rtl_hw_start_8168c_1(void __iomem *ioaddr, struct pci_dev *pdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3711
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3712
	static const struct ephy_info e_info_8168c_1[] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3713
		{ 0x02, 0x0800,	0x1000 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3714
		{ 0x03, 0,	0x0002 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3715
		{ 0x06, 0x0080,	0x0000 }
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3716
	};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3717
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3718
	rtl_csi_access_enable(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3719
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3720
	RTL_W8(DBG_REG, 0x06 | FIX_NAK_1 | FIX_NAK_2);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3721
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3722
	rtl_ephy_init(ioaddr, e_info_8168c_1, ARRAY_SIZE(e_info_8168c_1));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3723
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3724
	__rtl_hw_start_8168cp(ioaddr, pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3725
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3726
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3727
static void rtl_hw_start_8168c_2(void __iomem *ioaddr, struct pci_dev *pdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3728
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3729
	static const struct ephy_info e_info_8168c_2[] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3730
		{ 0x01, 0,	0x0001 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3731
		{ 0x03, 0x0400,	0x0220 }
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3732
	};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3733
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3734
	rtl_csi_access_enable(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3735
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3736
	rtl_ephy_init(ioaddr, e_info_8168c_2, ARRAY_SIZE(e_info_8168c_2));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3737
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3738
	__rtl_hw_start_8168cp(ioaddr, pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3739
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3740
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3741
static void rtl_hw_start_8168c_3(void __iomem *ioaddr, struct pci_dev *pdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3742
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3743
	rtl_hw_start_8168c_2(ioaddr, pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3744
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3745
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3746
static void rtl_hw_start_8168c_4(void __iomem *ioaddr, struct pci_dev *pdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3747
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3748
	rtl_csi_access_enable(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3749
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3750
	__rtl_hw_start_8168cp(ioaddr, pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3751
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3752
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3753
static void rtl_hw_start_8168d(void __iomem *ioaddr, struct pci_dev *pdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3754
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3755
	rtl_csi_access_enable(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3756
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3757
	rtl_disable_clock_request(pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3758
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3759
	RTL_W8(EarlyTxThres, EarlyTxThld);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3760
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3761
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3762
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3763
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3764
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3765
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3766
static void rtl_hw_start_8168(struct net_device *dev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3767
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3768
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3769
	void __iomem *ioaddr = tp->mmio_addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3770
	struct pci_dev *pdev = tp->pci_dev;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3771
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3772
	RTL_W8(Cfg9346, Cfg9346_Unlock);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3773
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3774
	RTL_W8(EarlyTxThres, EarlyTxThld);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3775
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3776
	rtl_set_rx_max_size(ioaddr, tp->rx_buf_sz);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3777
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3778
	tp->cp_cmd |= RTL_R16(CPlusCmd) | PktCntrDisable | INTT_1;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3779
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3780
	RTL_W16(CPlusCmd, tp->cp_cmd);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3781
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3782
	RTL_W16(IntrMitigate, 0x5151);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3783
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3784
	/* Work around for RxFIFO overflow. */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3785
	if (tp->mac_version == RTL_GIGA_MAC_VER_11) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3786
		tp->intr_event |= RxFIFOOver | PCSTimeout;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3787
		tp->intr_event &= ~RxOverflow;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3788
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3789
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3790
	rtl_set_rx_tx_desc_registers(tp, ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3791
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3792
	rtl_set_rx_mode(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3793
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3794
	RTL_W32(TxConfig, (TX_DMA_BURST << TxDMAShift) |
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3795
		(InterFrameGap << TxInterFrameGapShift));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3796
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3797
	RTL_R8(IntrMask);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3798
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3799
	switch (tp->mac_version) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3800
	case RTL_GIGA_MAC_VER_11:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3801
		rtl_hw_start_8168bb(ioaddr, pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3802
	break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3803
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3804
	case RTL_GIGA_MAC_VER_12:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3805
	case RTL_GIGA_MAC_VER_17:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3806
		rtl_hw_start_8168bef(ioaddr, pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3807
	break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3808
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3809
	case RTL_GIGA_MAC_VER_18:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3810
		rtl_hw_start_8168cp_1(ioaddr, pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3811
	break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3812
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3813
	case RTL_GIGA_MAC_VER_19:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3814
		rtl_hw_start_8168c_1(ioaddr, pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3815
	break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3816
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3817
	case RTL_GIGA_MAC_VER_20:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3818
		rtl_hw_start_8168c_2(ioaddr, pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3819
	break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3820
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3821
	case RTL_GIGA_MAC_VER_21:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3822
		rtl_hw_start_8168c_3(ioaddr, pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3823
	break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3824
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3825
	case RTL_GIGA_MAC_VER_22:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3826
		rtl_hw_start_8168c_4(ioaddr, pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3827
	break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3828
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3829
	case RTL_GIGA_MAC_VER_23:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3830
		rtl_hw_start_8168cp_2(ioaddr, pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3831
	break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3832
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3833
	case RTL_GIGA_MAC_VER_24:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3834
		rtl_hw_start_8168cp_3(ioaddr, pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3835
	break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3836
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3837
	case RTL_GIGA_MAC_VER_25:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3838
	case RTL_GIGA_MAC_VER_26:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3839
	case RTL_GIGA_MAC_VER_27:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3840
		rtl_hw_start_8168d(ioaddr, pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3841
	break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3842
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3843
	default:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3844
		printk(KERN_ERR PFX "%s: unknown chipset (mac_version = %d).\n",
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3845
			dev->name, tp->mac_version);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3846
	break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3847
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3848
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3849
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3850
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3851
	RTL_W8(Cfg9346, Cfg9346_Lock);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3852
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3853
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xF000);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3854
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3855
	if (!tp->ecdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3856
		RTL_W16(IntrMask, tp->intr_event);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3857
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3858
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3859
#define R810X_CPCMD_QUIRK_MASK (\
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3860
	EnableBist | \
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3861
	Mac_dbgo_oe | \
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3862
	Force_half_dup | \
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3863
	Force_rxflow_en | \
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3864
	Force_txflow_en | \
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3865
	Cxpl_dbg_sel | \
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3866
	ASF | \
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3867
	PktCntrDisable | \
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3868
	PCIDAC | \
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3869
	PCIMulRW)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3870
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3871
static void rtl_hw_start_8102e_1(void __iomem *ioaddr, struct pci_dev *pdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3872
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3873
	static const struct ephy_info e_info_8102e_1[] = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3874
		{ 0x01,	0, 0x6e65 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3875
		{ 0x02,	0, 0x091f },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3876
		{ 0x03,	0, 0xc2f9 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3877
		{ 0x06,	0, 0xafb5 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3878
		{ 0x07,	0, 0x0e00 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3879
		{ 0x19,	0, 0xec80 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3880
		{ 0x01,	0, 0x2e65 },
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3881
		{ 0x01,	0, 0x6e65 }
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3882
	};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3883
	u8 cfg1;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3884
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3885
	rtl_csi_access_enable(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3886
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3887
	RTL_W8(DBG_REG, FIX_NAK_1);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3888
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3889
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3890
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3891
	RTL_W8(Config1,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3892
	       LEDS1 | LEDS0 | Speed_down | MEMMAP | IOMAP | VPD | PMEnable);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3893
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3894
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3895
	cfg1 = RTL_R8(Config1);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3896
	if ((cfg1 & LEDS0) && (cfg1 & LEDS1))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3897
		RTL_W8(Config1, cfg1 & ~LEDS0);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3898
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3899
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R810X_CPCMD_QUIRK_MASK);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3900
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3901
	rtl_ephy_init(ioaddr, e_info_8102e_1, ARRAY_SIZE(e_info_8102e_1));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3902
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3903
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3904
static void rtl_hw_start_8102e_2(void __iomem *ioaddr, struct pci_dev *pdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3905
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3906
	rtl_csi_access_enable(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3907
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3908
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3909
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3910
	RTL_W8(Config1, MEMMAP | IOMAP | VPD | PMEnable);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3911
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3912
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3913
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R810X_CPCMD_QUIRK_MASK);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3914
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3915
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3916
static void rtl_hw_start_8102e_3(void __iomem *ioaddr, struct pci_dev *pdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3917
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3918
	rtl_hw_start_8102e_2(ioaddr, pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3919
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3920
	rtl_ephy_write(ioaddr, 0x03, 0xc2f9);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3921
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3922
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3923
static void rtl_hw_start_8101(struct net_device *dev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3924
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3925
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3926
	void __iomem *ioaddr = tp->mmio_addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3927
	struct pci_dev *pdev = tp->pci_dev;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3928
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3929
	if ((tp->mac_version == RTL_GIGA_MAC_VER_13) ||
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3930
	    (tp->mac_version == RTL_GIGA_MAC_VER_16)) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3931
		int cap = tp->pcie_cap;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3932
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3933
		if (cap) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3934
			pci_write_config_word(pdev, cap + PCI_EXP_DEVCTL,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3935
					      PCI_EXP_DEVCTL_NOSNOOP_EN);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3936
		}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3937
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3938
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3939
	switch (tp->mac_version) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3940
	case RTL_GIGA_MAC_VER_07:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3941
		rtl_hw_start_8102e_1(ioaddr, pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3942
		break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3943
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3944
	case RTL_GIGA_MAC_VER_08:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3945
		rtl_hw_start_8102e_3(ioaddr, pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3946
		break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3947
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3948
	case RTL_GIGA_MAC_VER_09:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3949
		rtl_hw_start_8102e_2(ioaddr, pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3950
		break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3951
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3952
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3953
	RTL_W8(Cfg9346, Cfg9346_Unlock);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3954
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3955
	RTL_W8(EarlyTxThres, EarlyTxThld);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3956
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3957
	rtl_set_rx_max_size(ioaddr, tp->rx_buf_sz);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3958
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3959
	tp->cp_cmd |= rtl_rw_cpluscmd(ioaddr) | PCIMulRW;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3960
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3961
	RTL_W16(CPlusCmd, tp->cp_cmd);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3962
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3963
	RTL_W16(IntrMitigate, 0x0000);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3964
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3965
	rtl_set_rx_tx_desc_registers(tp, ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3966
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3967
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3968
	rtl_set_rx_tx_config_registers(tp);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3969
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3970
	RTL_W8(Cfg9346, Cfg9346_Lock);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3971
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3972
	RTL_R8(IntrMask);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3973
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3974
	rtl_set_rx_mode(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3975
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3976
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3977
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3978
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xf000);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3979
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3980
	if (!tp->ecdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3981
		RTL_W16(IntrMask, tp->intr_event);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3982
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3983
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3984
static int rtl8169_change_mtu(struct net_device *dev, int new_mtu)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3985
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3986
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3987
	int ret = 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3988
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3989
	if (new_mtu < ETH_ZLEN || new_mtu > SafeMtu)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3990
		return -EINVAL;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3991
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3992
	dev->mtu = new_mtu;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3993
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3994
	if (!netif_running(dev))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3995
		goto out;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3996
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3997
	rtl8169_down(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3998
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3999
	rtl8169_set_rxbufsize(tp, dev->mtu);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4000
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4001
	ret = rtl8169_init_ring(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4002
	if (ret < 0)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4003
		goto out;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4004
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4005
	napi_enable(&tp->napi);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4006
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4007
	rtl_hw_start(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4008
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4009
	rtl8169_request_timer(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4010
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4011
out:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4012
	return ret;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4013
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4014
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4015
static inline void rtl8169_make_unusable_by_asic(struct RxDesc *desc)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4016
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4017
	desc->addr = cpu_to_le64(0x0badbadbadbadbadull);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4018
	desc->opts1 &= ~cpu_to_le32(DescOwn | RsvdMask);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4019
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4020
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4021
static void rtl8169_free_rx_skb(struct rtl8169_private *tp,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4022
				struct sk_buff **sk_buff, struct RxDesc *desc)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4023
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4024
	struct pci_dev *pdev = tp->pci_dev;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4025
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4026
	pci_unmap_single(pdev, le64_to_cpu(desc->addr), tp->rx_buf_sz,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4027
			 PCI_DMA_FROMDEVICE);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4028
	dev_kfree_skb(*sk_buff);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4029
	*sk_buff = NULL;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4030
	rtl8169_make_unusable_by_asic(desc);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4031
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4032
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4033
static inline void rtl8169_mark_to_asic(struct RxDesc *desc, u32 rx_buf_sz)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4034
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4035
	u32 eor = le32_to_cpu(desc->opts1) & RingEnd;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4036
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4037
	desc->opts1 = cpu_to_le32(DescOwn | eor | rx_buf_sz);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4038
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4039
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4040
static inline void rtl8169_map_to_asic(struct RxDesc *desc, dma_addr_t mapping,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4041
				       u32 rx_buf_sz)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4042
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4043
	desc->addr = cpu_to_le64(mapping);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4044
	wmb();
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4045
	rtl8169_mark_to_asic(desc, rx_buf_sz);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4046
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4047
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4048
static struct sk_buff *rtl8169_alloc_rx_skb(struct pci_dev *pdev,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4049
					    struct net_device *dev,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4050
					    struct RxDesc *desc, int rx_buf_sz,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4051
					    unsigned int align, gfp_t gfp)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4052
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4053
	struct sk_buff *skb;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4054
	dma_addr_t mapping;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4055
	unsigned int pad;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4056
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4057
	pad = align ? align : NET_IP_ALIGN;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4058
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4059
	skb = __netdev_alloc_skb(dev, rx_buf_sz + pad, gfp);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4060
	if (!skb)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4061
		goto err_out;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4062
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4063
	skb_reserve(skb, align ? ((pad - 1) & (unsigned long)skb->data) : pad);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4064
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4065
	mapping = pci_map_single(pdev, skb->data, rx_buf_sz,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4066
				 PCI_DMA_FROMDEVICE);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4067
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4068
	rtl8169_map_to_asic(desc, mapping, rx_buf_sz);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4069
out:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4070
	return skb;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4071
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4072
err_out:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4073
	rtl8169_make_unusable_by_asic(desc);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4074
	goto out;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4075
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4076
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4077
static void rtl8169_rx_clear(struct rtl8169_private *tp)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4078
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4079
	unsigned int i;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4080
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4081
	for (i = 0; i < NUM_RX_DESC; i++) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4082
		if (tp->Rx_skbuff[i]) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4083
			rtl8169_free_rx_skb(tp, tp->Rx_skbuff + i,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4084
					    tp->RxDescArray + i);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4085
		}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4086
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4087
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4088
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4089
static u32 rtl8169_rx_fill(struct rtl8169_private *tp, struct net_device *dev,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4090
			   u32 start, u32 end, gfp_t gfp)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4091
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4092
	u32 cur;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4093
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4094
	for (cur = start; end - cur != 0; cur++) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4095
		struct sk_buff *skb;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4096
		unsigned int i = cur % NUM_RX_DESC;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4097
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4098
		WARN_ON((s32)(end - cur) < 0);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4099
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4100
		if (tp->Rx_skbuff[i])
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4101
			continue;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4102
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4103
		skb = rtl8169_alloc_rx_skb(tp->pci_dev, dev,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4104
					   tp->RxDescArray + i,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4105
					   tp->rx_buf_sz, tp->align, gfp);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4106
		if (!skb)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4107
			break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4108
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4109
		tp->Rx_skbuff[i] = skb;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4110
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4111
	return cur - start;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4112
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4113
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4114
static inline void rtl8169_mark_as_last_descriptor(struct RxDesc *desc)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4115
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4116
	desc->opts1 |= cpu_to_le32(RingEnd);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4117
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4118
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4119
static void rtl8169_init_ring_indexes(struct rtl8169_private *tp)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4120
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4121
	tp->dirty_tx = tp->dirty_rx = tp->cur_tx = tp->cur_rx = 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4122
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4123
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4124
static int rtl8169_init_ring(struct net_device *dev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4125
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4126
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4127
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4128
	rtl8169_init_ring_indexes(tp);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4129
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4130
	memset(tp->tx_skb, 0x0, NUM_TX_DESC * sizeof(struct ring_info));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4131
	memset(tp->Rx_skbuff, 0x0, NUM_RX_DESC * sizeof(struct sk_buff *));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4132
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4133
	if (rtl8169_rx_fill(tp, dev, 0, NUM_RX_DESC, GFP_KERNEL) != NUM_RX_DESC)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4134
		goto err_out;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4135
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4136
	rtl8169_mark_as_last_descriptor(tp->RxDescArray + NUM_RX_DESC - 1);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4137
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4138
	return 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4139
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4140
err_out:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4141
	rtl8169_rx_clear(tp);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4142
	return -ENOMEM;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4143
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4144
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4145
static void rtl8169_unmap_tx_skb(struct pci_dev *pdev, struct ring_info *tx_skb,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4146
				 struct TxDesc *desc)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4147
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4148
	unsigned int len = tx_skb->len;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4149
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4150
	pci_unmap_single(pdev, le64_to_cpu(desc->addr), len, PCI_DMA_TODEVICE);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4151
	desc->opts1 = 0x00;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4152
	desc->opts2 = 0x00;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4153
	desc->addr = 0x00;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4154
	tx_skb->len = 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4155
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4156
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4157
static void rtl8169_tx_clear(struct rtl8169_private *tp)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4158
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4159
	unsigned int i;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4160
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4161
	for (i = tp->dirty_tx; i < tp->dirty_tx + NUM_TX_DESC; i++) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4162
		unsigned int entry = i % NUM_TX_DESC;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4163
		struct ring_info *tx_skb = tp->tx_skb + entry;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4164
		unsigned int len = tx_skb->len;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4165
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4166
		if (len) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4167
			struct sk_buff *skb = tx_skb->skb;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4168
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4169
			rtl8169_unmap_tx_skb(tp->pci_dev, tx_skb,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4170
					     tp->TxDescArray + entry);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4171
			if (skb) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4172
				if (!tp->ecdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4173
					dev_kfree_skb(skb);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4174
				tx_skb->skb = NULL;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4175
			}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4176
			tp->dev->stats.tx_dropped++;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4177
		}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4178
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4179
	tp->cur_tx = tp->dirty_tx = 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4180
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4181
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4182
static void rtl8169_schedule_work(struct net_device *dev, work_func_t task)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4183
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4184
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4185
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4186
	PREPARE_DELAYED_WORK(&tp->task, task);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4187
	schedule_delayed_work(&tp->task, 4);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4188
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4189
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4190
static void rtl8169_wait_for_quiescence(struct net_device *dev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4191
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4192
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4193
	void __iomem *ioaddr = tp->mmio_addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4194
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4195
	synchronize_irq(dev->irq);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4196
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4197
	/* Wait for any pending NAPI task to complete */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4198
	napi_disable(&tp->napi);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4199
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4200
	rtl8169_irq_mask_and_ack(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4201
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4202
	tp->intr_mask = 0xffff;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4203
	RTL_W16(IntrMask, tp->intr_event);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4204
	napi_enable(&tp->napi);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4205
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4206
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4207
static void rtl8169_reinit_task(struct work_struct *work)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4208
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4209
	struct rtl8169_private *tp =
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4210
		container_of(work, struct rtl8169_private, task.work);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4211
	struct net_device *dev = tp->dev;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4212
	int ret;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4213
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4214
	rtnl_lock();
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4215
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4216
	if (!netif_running(dev))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4217
		goto out_unlock;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4218
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4219
	rtl8169_wait_for_quiescence(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4220
	rtl8169_close(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4221
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4222
	ret = rtl8169_open(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4223
	if (unlikely(ret < 0)) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4224
		if (net_ratelimit())
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4225
			netif_err(tp, drv, dev,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4226
				  "reinit failure (status = %d). Rescheduling\n",
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4227
				  ret);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4228
		rtl8169_schedule_work(dev, rtl8169_reinit_task);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4229
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4230
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4231
out_unlock:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4232
	rtnl_unlock();
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4233
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4234
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4235
static void rtl8169_reset_task(struct work_struct *work)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4236
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4237
	struct rtl8169_private *tp =
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4238
		container_of(work, struct rtl8169_private, task.work);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4239
	struct net_device *dev = tp->dev;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4240
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4241
	rtnl_lock();
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4242
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4243
	if (!netif_running(dev))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4244
		goto out_unlock;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4245
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4246
	rtl8169_wait_for_quiescence(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4247
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4248
	rtl8169_rx_interrupt(dev, tp, tp->mmio_addr, ~(u32)0);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4249
	rtl8169_tx_clear(tp);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4250
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4251
	if (tp->dirty_rx == tp->cur_rx) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4252
		rtl8169_init_ring_indexes(tp);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4253
		rtl_hw_start(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4254
		netif_wake_queue(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4255
		rtl8169_check_link_status(dev, tp, tp->mmio_addr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4256
	} else {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4257
		if (net_ratelimit())
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4258
			netif_emerg(tp, intr, dev, "Rx buffers shortage\n");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4259
		rtl8169_schedule_work(dev, rtl8169_reset_task);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4260
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4261
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4262
out_unlock:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4263
	rtnl_unlock();
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4264
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4265
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4266
static void rtl8169_tx_timeout(struct net_device *dev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4267
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4268
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4269
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4270
	if (tp->ecdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4271
		return;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4272
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4273
	rtl8169_hw_reset(tp->mmio_addr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4274
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4275
	/* Let's wait a bit while any (async) irq lands on */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4276
	rtl8169_schedule_work(dev, rtl8169_reset_task);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4277
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4278
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4279
static int rtl8169_xmit_frags(struct rtl8169_private *tp, struct sk_buff *skb,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4280
			      u32 opts1)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4281
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4282
	struct skb_shared_info *info = skb_shinfo(skb);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4283
	unsigned int cur_frag, entry;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4284
	struct TxDesc * uninitialized_var(txd);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4285
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4286
	entry = tp->cur_tx;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4287
	for (cur_frag = 0; cur_frag < info->nr_frags; cur_frag++) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4288
		skb_frag_t *frag = info->frags + cur_frag;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4289
		dma_addr_t mapping;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4290
		u32 status, len;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4291
		void *addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4292
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4293
		entry = (entry + 1) % NUM_TX_DESC;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4294
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4295
		txd = tp->TxDescArray + entry;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4296
		len = frag->size;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4297
		addr = ((void *) page_address(frag->page)) + frag->page_offset;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4298
		mapping = pci_map_single(tp->pci_dev, addr, len, PCI_DMA_TODEVICE);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4299
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4300
		/* anti gcc 2.95.3 bugware (sic) */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4301
		status = opts1 | len | (RingEnd * !((entry + 1) % NUM_TX_DESC));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4302
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4303
		txd->opts1 = cpu_to_le32(status);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4304
		txd->addr = cpu_to_le64(mapping);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4305
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4306
		tp->tx_skb[entry].len = len;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4307
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4308
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4309
	if (cur_frag) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4310
		tp->tx_skb[entry].skb = skb;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4311
		txd->opts1 |= cpu_to_le32(LastFrag);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4312
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4313
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4314
	return cur_frag;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4315
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4316
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4317
static inline u32 rtl8169_tso_csum(struct sk_buff *skb, struct net_device *dev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4318
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4319
	if (dev->features & NETIF_F_TSO) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4320
		u32 mss = skb_shinfo(skb)->gso_size;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4321
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4322
		if (mss)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4323
			return LargeSend | ((mss & MSSMask) << MSSShift);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4324
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4325
	if (skb->ip_summed == CHECKSUM_PARTIAL) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4326
		const struct iphdr *ip = ip_hdr(skb);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4327
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4328
		if (ip->protocol == IPPROTO_TCP)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4329
			return IPCS | TCPCS;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4330
		else if (ip->protocol == IPPROTO_UDP)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4331
			return IPCS | UDPCS;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4332
		WARN_ON(1);	/* we need a WARN() */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4333
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4334
	return 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4335
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4336
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4337
static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4338
				      struct net_device *dev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4339
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4340
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4341
	unsigned int frags, entry = tp->cur_tx % NUM_TX_DESC;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4342
	struct TxDesc *txd = tp->TxDescArray + entry;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4343
	void __iomem *ioaddr = tp->mmio_addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4344
	dma_addr_t mapping;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4345
	u32 status, len;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4346
	u32 opts1;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4347
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4348
	if (unlikely(TX_BUFFS_AVAIL(tp) < skb_shinfo(skb)->nr_frags)) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4349
		netif_err(tp, drv, dev, "BUG! Tx Ring full when queue awake!\n");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4350
		goto err_stop;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4351
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4352
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4353
	if (unlikely(le32_to_cpu(txd->opts1) & DescOwn))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4354
		goto err_stop;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4355
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4356
	opts1 = DescOwn | rtl8169_tso_csum(skb, dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4357
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4358
	frags = rtl8169_xmit_frags(tp, skb, opts1);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4359
	if (frags) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4360
		len = skb_headlen(skb);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4361
		opts1 |= FirstFrag;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4362
	} else {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4363
		len = skb->len;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4364
		opts1 |= FirstFrag | LastFrag;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4365
		tp->tx_skb[entry].skb = skb;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4366
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4367
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4368
	mapping = pci_map_single(tp->pci_dev, skb->data, len, PCI_DMA_TODEVICE);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4369
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4370
	tp->tx_skb[entry].len = len;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4371
	txd->addr = cpu_to_le64(mapping);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4372
	txd->opts2 = cpu_to_le32(rtl8169_tx_vlan_tag(tp, skb));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4373
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4374
	wmb();
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4375
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4376
	/* anti gcc 2.95.3 bugware (sic) */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4377
	status = opts1 | len | (RingEnd * !((entry + 1) % NUM_TX_DESC));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4378
	txd->opts1 = cpu_to_le32(status);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4379
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4380
	tp->cur_tx += frags + 1;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4381
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4382
	wmb();
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4383
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4384
	RTL_W8(TxPoll, NPQ);	/* set polling bit */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4385
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4386
	if (!tp->ecdev && TX_BUFFS_AVAIL(tp) < MAX_SKB_FRAGS) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4387
		netif_stop_queue(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4388
		smp_rmb();
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4389
		if (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4390
			netif_wake_queue(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4391
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4392
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4393
	return NETDEV_TX_OK;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4394
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4395
err_stop:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4396
	if (!tp->ecdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4397
		netif_stop_queue(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4398
	dev->stats.tx_dropped++;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4399
	return NETDEV_TX_BUSY;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4400
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4401
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4402
static void rtl8169_pcierr_interrupt(struct net_device *dev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4403
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4404
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4405
	struct pci_dev *pdev = tp->pci_dev;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4406
	void __iomem *ioaddr = tp->mmio_addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4407
	u16 pci_status, pci_cmd;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4408
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4409
	pci_read_config_word(pdev, PCI_COMMAND, &pci_cmd);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4410
	pci_read_config_word(pdev, PCI_STATUS, &pci_status);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4411
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4412
	netif_err(tp, intr, dev, "PCI error (cmd = 0x%04x, status = 0x%04x)\n",
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4413
		  pci_cmd, pci_status);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4414
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4415
	/*
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4416
	 * The recovery sequence below admits a very elaborated explanation:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4417
	 * - it seems to work;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4418
	 * - I did not see what else could be done;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4419
	 * - it makes iop3xx happy.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4420
	 *
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4421
	 * Feel free to adjust to your needs.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4422
	 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4423
	if (pdev->broken_parity_status)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4424
		pci_cmd &= ~PCI_COMMAND_PARITY;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4425
	else
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4426
		pci_cmd |= PCI_COMMAND_SERR | PCI_COMMAND_PARITY;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4427
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4428
	pci_write_config_word(pdev, PCI_COMMAND, pci_cmd);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4429
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4430
	pci_write_config_word(pdev, PCI_STATUS,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4431
		pci_status & (PCI_STATUS_DETECTED_PARITY |
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4432
		PCI_STATUS_SIG_SYSTEM_ERROR | PCI_STATUS_REC_MASTER_ABORT |
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4433
		PCI_STATUS_REC_TARGET_ABORT | PCI_STATUS_SIG_TARGET_ABORT));
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4434
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4435
	/* The infamous DAC f*ckup only happens at boot time */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4436
	if ((tp->cp_cmd & PCIDAC) && !tp->dirty_rx && !tp->cur_rx) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4437
		netif_info(tp, intr, dev, "disabling PCI DAC\n");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4438
		tp->cp_cmd &= ~PCIDAC;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4439
		RTL_W16(CPlusCmd, tp->cp_cmd);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4440
		dev->features &= ~NETIF_F_HIGHDMA;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4441
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4442
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4443
	rtl8169_hw_reset(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4444
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4445
	rtl8169_schedule_work(dev, rtl8169_reinit_task);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4446
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4447
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4448
static void rtl8169_tx_interrupt(struct net_device *dev,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4449
				 struct rtl8169_private *tp,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4450
				 void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4451
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4452
	unsigned int dirty_tx, tx_left;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4453
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4454
	dirty_tx = tp->dirty_tx;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4455
	smp_rmb();
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4456
	tx_left = tp->cur_tx - dirty_tx;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4457
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4458
	while (tx_left > 0) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4459
		unsigned int entry = dirty_tx % NUM_TX_DESC;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4460
		struct ring_info *tx_skb = tp->tx_skb + entry;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4461
		u32 len = tx_skb->len;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4462
		u32 status;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4463
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4464
		rmb();
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4465
		status = le32_to_cpu(tp->TxDescArray[entry].opts1);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4466
		if (status & DescOwn)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4467
			break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4468
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4469
		dev->stats.tx_bytes += len;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4470
		dev->stats.tx_packets++;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4471
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4472
		rtl8169_unmap_tx_skb(tp->pci_dev, tx_skb, tp->TxDescArray + entry);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4473
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4474
		if (status & LastFrag) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4475
			if (!tp->ecdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4476
				dev_kfree_skb(tx_skb->skb);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4477
			tx_skb->skb = NULL;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4478
		}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4479
		dirty_tx++;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4480
		tx_left--;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4481
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4482
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4483
	if (tp->dirty_tx != dirty_tx) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4484
		tp->dirty_tx = dirty_tx;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4485
		smp_wmb();
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4486
		if (!tp->ecdev && netif_queue_stopped(dev) &&
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4487
		    (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4488
			netif_wake_queue(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4489
		}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4490
		/*
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4491
		 * 8168 hack: TxPoll requests are lost when the Tx packets are
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4492
		 * too close. Let's kick an extra TxPoll request when a burst
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4493
		 * of start_xmit activity is detected (if it is not detected,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4494
		 * it is slow enough). -- FR
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4495
		 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4496
		smp_rmb();
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4497
		if (tp->cur_tx != dirty_tx)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4498
			RTL_W8(TxPoll, NPQ);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4499
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4500
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4501
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4502
static inline int rtl8169_fragmented_frame(u32 status)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4503
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4504
	return (status & (FirstFrag | LastFrag)) != (FirstFrag | LastFrag);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4505
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4506
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4507
static inline void rtl8169_rx_csum(struct sk_buff *skb, struct RxDesc *desc)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4508
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4509
	u32 opts1 = le32_to_cpu(desc->opts1);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4510
	u32 status = opts1 & RxProtoMask;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4511
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4512
	if (((status == RxProtoTCP) && !(opts1 & TCPFail)) ||
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4513
	    ((status == RxProtoUDP) && !(opts1 & UDPFail)) ||
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4514
	    ((status == RxProtoIP) && !(opts1 & IPFail)))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4515
		skb->ip_summed = CHECKSUM_UNNECESSARY;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4516
	else
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4517
		skb->ip_summed = CHECKSUM_NONE;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4518
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4519
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4520
static inline bool rtl8169_try_rx_copy(struct sk_buff **sk_buff,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4521
				       struct rtl8169_private *tp, int pkt_size,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4522
				       dma_addr_t addr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4523
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4524
	struct sk_buff *skb;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4525
	bool done = false;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4526
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4527
	if (pkt_size >= rx_copybreak)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4528
		goto out;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4529
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4530
	skb = netdev_alloc_skb_ip_align(tp->dev, pkt_size);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4531
	if (!skb)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4532
		goto out;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4533
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4534
	pci_dma_sync_single_for_cpu(tp->pci_dev, addr, pkt_size,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4535
				    PCI_DMA_FROMDEVICE);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4536
	skb_copy_from_linear_data(*sk_buff, skb->data, pkt_size);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4537
	*sk_buff = skb;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4538
	done = true;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4539
out:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4540
	return done;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4541
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4542
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4543
/*
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4544
 * Warning : rtl8169_rx_interrupt() might be called :
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4545
 * 1) from NAPI (softirq) context
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4546
 *	(polling = 1 : we should call netif_receive_skb())
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4547
 * 2) from process context (rtl8169_reset_task())
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4548
 *	(polling = 0 : we must call netif_rx() instead)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4549
 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4550
static int rtl8169_rx_interrupt(struct net_device *dev,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4551
				struct rtl8169_private *tp,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4552
				void __iomem *ioaddr, u32 budget)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4553
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4554
	unsigned int cur_rx, rx_left;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4555
	unsigned int delta, count;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4556
	int polling = (budget != ~(u32)0) ? 1 : 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4557
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4558
	cur_rx = tp->cur_rx;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4559
	rx_left = NUM_RX_DESC + tp->dirty_rx - cur_rx;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4560
	rx_left = min(rx_left, budget);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4561
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4562
	for (; rx_left > 0; rx_left--, cur_rx++) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4563
		unsigned int entry = cur_rx % NUM_RX_DESC;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4564
		struct RxDesc *desc = tp->RxDescArray + entry;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4565
		u32 status;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4566
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4567
		rmb();
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4568
		status = le32_to_cpu(desc->opts1);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4569
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4570
		if (status & DescOwn)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4571
			break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4572
		if (unlikely(status & RxRES)) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4573
			netif_info(tp, rx_err, dev, "Rx ERROR. status = %08x\n",
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4574
				   status);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4575
			dev->stats.rx_errors++;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4576
			if (status & (RxRWT | RxRUNT))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4577
				dev->stats.rx_length_errors++;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4578
			if (status & RxCRC)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4579
				dev->stats.rx_crc_errors++;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4580
			if (status & RxFOVF) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4581
				if (!tp->ecdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4582
					rtl8169_schedule_work(dev, rtl8169_reset_task);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4583
				dev->stats.rx_fifo_errors++;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4584
			}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4585
			rtl8169_mark_to_asic(desc, tp->rx_buf_sz);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4586
		} else {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4587
			struct sk_buff *skb = tp->Rx_skbuff[entry];
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4588
			dma_addr_t addr = le64_to_cpu(desc->addr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4589
			int pkt_size = (status & 0x00001FFF) - 4;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4590
			struct pci_dev *pdev = tp->pci_dev;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4591
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4592
			/*
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4593
			 * The driver does not support incoming fragmented
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4594
			 * frames. They are seen as a symptom of over-mtu
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4595
			 * sized frames.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4596
			 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4597
			if (unlikely(rtl8169_fragmented_frame(status))) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4598
				dev->stats.rx_dropped++;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4599
				dev->stats.rx_length_errors++;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4600
				rtl8169_mark_to_asic(desc, tp->rx_buf_sz);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4601
				continue;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4602
			}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4603
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4604
			rtl8169_rx_csum(skb, desc);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4605
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4606
			if (tp->ecdev) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4607
				/* reusing parts of rtl8169_try_rx_copy() */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4608
				pci_dma_sync_single_for_cpu(pdev, addr, pkt_size,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4609
						PCI_DMA_FROMDEVICE);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4610
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4611
				ecdev_receive(tp->ecdev, skb->data, pkt_size);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4612
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4613
				pci_dma_sync_single_for_device(pdev, addr,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4614
					pkt_size, PCI_DMA_FROMDEVICE);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4615
				rtl8169_mark_to_asic(desc, tp->rx_buf_sz);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4616
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4617
				// No need to detect link status as
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4618
				// long as frames are received: Reset watchdog.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4619
				tp->ec_watchdog_jiffies = jiffies;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4620
			} else {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4621
				if (rtl8169_try_rx_copy(&skb, tp, pkt_size, addr)) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4622
					pci_dma_sync_single_for_device(pdev, addr,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4623
						pkt_size, PCI_DMA_FROMDEVICE);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4624
					rtl8169_mark_to_asic(desc, tp->rx_buf_sz);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4625
				} else {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4626
					pci_unmap_single(pdev, addr, tp->rx_buf_sz,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4627
							 PCI_DMA_FROMDEVICE);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4628
					tp->Rx_skbuff[entry] = NULL;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4629
				}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4630
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4631
				skb_put(skb, pkt_size);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4632
				skb->protocol = eth_type_trans(skb, dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4633
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4634
				if (rtl8169_rx_vlan_skb(tp, desc, skb, polling) < 0) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4635
					if (likely(polling))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4636
						netif_receive_skb(skb);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4637
					else
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4638
						netif_rx(skb);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4639
				}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4640
			}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4641
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4642
			dev->stats.rx_bytes += pkt_size;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4643
			dev->stats.rx_packets++;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4644
		}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4645
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4646
		/* Work around for AMD plateform. */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4647
		if ((desc->opts2 & cpu_to_le32(0xfffe000)) &&
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4648
		    (tp->mac_version == RTL_GIGA_MAC_VER_05)) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4649
			desc->opts2 = 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4650
			cur_rx++;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4651
		}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4652
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4653
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4654
	count = cur_rx - tp->cur_rx;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4655
	tp->cur_rx = cur_rx;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4656
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4657
	delta = rtl8169_rx_fill(tp, dev, tp->dirty_rx, tp->cur_rx, GFP_ATOMIC);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4658
	if (!delta && count)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4659
		netif_info(tp, intr, dev, "no Rx buffer allocated\n");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4660
	tp->dirty_rx += delta;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4661
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4662
	/*
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4663
	 * FIXME: until there is periodic timer to try and refill the ring,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4664
	 * a temporary shortage may definitely kill the Rx process.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4665
	 * - disable the asic to try and avoid an overflow and kick it again
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4666
	 *   after refill ?
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4667
	 * - how do others driver handle this condition (Uh oh...).
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4668
	 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4669
	if (tp->dirty_rx + NUM_RX_DESC == tp->cur_rx)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4670
		netif_emerg(tp, intr, dev, "Rx buffers exhausted\n");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4671
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4672
	return count;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4673
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4674
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4675
static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4676
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4677
	struct net_device *dev = dev_instance;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4678
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4679
	void __iomem *ioaddr = tp->mmio_addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4680
	int handled = 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4681
	int status;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4682
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4683
	/* loop handling interrupts until we have no new ones or
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4684
	 * we hit a invalid/hotplug case.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4685
	 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4686
	status = RTL_R16(IntrStatus);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4687
	while (status && status != 0xffff) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4688
		handled = 1;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4689
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4690
		/* Handle all of the error cases first. These will reset
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4691
		 * the chip, so just exit the loop.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4692
		 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4693
		if (unlikely(!tp->ecdev && !netif_running(dev))) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4694
			rtl8169_asic_down(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4695
			break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4696
		}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4697
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4698
		/* Work around for rx fifo overflow */
2278
116355beeea5 Fixed opening device.
Florian Pose <fp@igh-essen.com>
parents: 2277
diff changeset
  4699
		if (unlikely(!tp->ecdev && (status & RxFIFOOver)) &&
2277
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4700
		(tp->mac_version == RTL_GIGA_MAC_VER_11)) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4701
			netif_stop_queue(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4702
			rtl8169_tx_timeout(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4703
			break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4704
		}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4705
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4706
		if (unlikely(status & SYSErr)) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4707
			rtl8169_pcierr_interrupt(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4708
			break;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4709
		}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4710
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4711
		if (status & LinkChg)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4712
			rtl8169_check_link_status(dev, tp, ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4713
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4714
		/* We need to see the lastest version of tp->intr_mask to
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4715
		 * avoid ignoring an MSI interrupt and having to wait for
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4716
		 * another event which may never come.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4717
		 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4718
		smp_rmb();
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4719
		if (status & tp->intr_mask & tp->napi_event) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4720
			RTL_W16(IntrMask, tp->intr_event & ~tp->napi_event);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4721
			tp->intr_mask = ~tp->napi_event;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4722
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4723
			if (likely(napi_schedule_prep(&tp->napi)))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4724
				__napi_schedule(&tp->napi);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4725
			else
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4726
				netif_info(tp, intr, dev,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4727
					   "interrupt %04x in poll\n", status);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4728
		}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4729
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4730
		/* We only get a new MSI interrupt when all active irq
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4731
		 * sources on the chip have been acknowledged. So, ack
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4732
		 * everything we've seen and check if new sources have become
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4733
		 * active to avoid blocking all interrupts from the chip.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4734
		 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4735
		RTL_W16(IntrStatus,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4736
			(status & RxFIFOOver) ? (status | RxOverflow) : status);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4737
		status = RTL_R16(IntrStatus);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4738
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4739
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4740
	return IRQ_RETVAL(handled);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4741
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4742
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4743
static void ec_poll(struct net_device *dev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4744
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4745
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4746
	struct pci_dev *pdev = tp->pci_dev;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4747
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4748
	rtl8169_interrupt(pdev->irq, dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4749
	rtl8169_rx_interrupt(dev, tp, tp->mmio_addr, 100); // FIXME
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4750
	rtl8169_tx_interrupt(dev, tp, tp->mmio_addr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4751
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4752
	if (jiffies - tp->ec_watchdog_jiffies >= 2 * HZ) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4753
		rtl8169_phy_timer((unsigned long) dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4754
		tp->ec_watchdog_jiffies = jiffies;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4755
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4756
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4757
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4758
static int rtl8169_poll(struct napi_struct *napi, int budget)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4759
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4760
	struct rtl8169_private *tp = container_of(napi, struct rtl8169_private, napi);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4761
	struct net_device *dev = tp->dev;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4762
	void __iomem *ioaddr = tp->mmio_addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4763
	int work_done;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4764
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4765
	work_done = rtl8169_rx_interrupt(dev, tp, ioaddr, (u32) budget);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4766
	rtl8169_tx_interrupt(dev, tp, ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4767
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4768
	if (work_done < budget) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4769
		napi_complete(napi);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4770
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4771
		/* We need for force the visibility of tp->intr_mask
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4772
		 * for other CPUs, as we can loose an MSI interrupt
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4773
		 * and potentially wait for a retransmit timeout if we don't.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4774
		 * The posted write to IntrMask is safe, as it will
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4775
		 * eventually make it to the chip and we won't loose anything
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4776
		 * until it does.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4777
		 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4778
		tp->intr_mask = 0xffff;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4779
		wmb();
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4780
		RTL_W16(IntrMask, tp->intr_event);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4781
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4782
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4783
	return work_done;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4784
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4785
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4786
static void rtl8169_rx_missed(struct net_device *dev, void __iomem *ioaddr)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4787
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4788
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4789
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4790
	if (tp->mac_version > RTL_GIGA_MAC_VER_06)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4791
		return;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4792
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4793
	dev->stats.rx_missed_errors += (RTL_R32(RxMissed) & 0xffffff);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4794
	RTL_W32(RxMissed, 0);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4795
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4796
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4797
static void rtl8169_down(struct net_device *dev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4798
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4799
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4800
	void __iomem *ioaddr = tp->mmio_addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4801
	unsigned int intrmask;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4802
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4803
	if (!tp->ecdev) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4804
		rtl8169_delete_timer(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4805
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4806
		netif_stop_queue(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4807
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4808
		napi_disable(&tp->napi);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4809
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4810
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4811
core_down:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4812
	if (!tp->ecdev) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4813
		spin_lock_irq(&tp->lock);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4814
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4815
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4816
	rtl8169_asic_down(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4817
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4818
	rtl8169_rx_missed(dev, ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4819
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4820
	if (!tp->ecdev) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4821
		spin_unlock_irq(&tp->lock);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4822
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4823
		synchronize_irq(dev->irq);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4824
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4825
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4826
	/* Give a racing hard_start_xmit a few cycles to complete. */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4827
	synchronize_sched();  /* FIXME: should this be synchronize_irq()? */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4828
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4829
	/*
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4830
	 * And now for the 50k$ question: are IRQ disabled or not ?
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4831
	 *
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4832
	 * Two paths lead here:
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4833
	 * 1) dev->close
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4834
	 *    -> netif_running() is available to sync the current code and the
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4835
	 *       IRQ handler. See rtl8169_interrupt for details.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4836
	 * 2) dev->change_mtu
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4837
	 *    -> rtl8169_poll can not be issued again and re-enable the
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4838
	 *       interruptions. Let's simply issue the IRQ down sequence again.
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4839
	 *
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4840
	 * No loop if hotpluged or major error (0xffff).
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4841
	 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4842
	intrmask = RTL_R16(IntrMask);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4843
	if (intrmask && (intrmask != 0xffff))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4844
		goto core_down;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4845
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4846
	rtl8169_tx_clear(tp);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4847
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4848
	rtl8169_rx_clear(tp);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4849
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4850
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4851
static int rtl8169_close(struct net_device *dev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4852
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4853
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4854
	struct pci_dev *pdev = tp->pci_dev;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4855
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4856
	pm_runtime_get_sync(&pdev->dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4857
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4858
	/* update counters before going down */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4859
	rtl8169_update_counters(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4860
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4861
	rtl8169_down(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4862
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4863
	if (!tp->ecdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4864
		free_irq(dev->irq, dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4865
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4866
	pci_free_consistent(pdev, R8169_RX_RING_BYTES, tp->RxDescArray,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4867
			    tp->RxPhyAddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4868
	pci_free_consistent(pdev, R8169_TX_RING_BYTES, tp->TxDescArray,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4869
			    tp->TxPhyAddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4870
	tp->TxDescArray = NULL;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4871
	tp->RxDescArray = NULL;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4872
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4873
	pm_runtime_put_sync(&pdev->dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4874
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4875
	return 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4876
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4877
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4878
static void rtl_set_rx_mode(struct net_device *dev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4879
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4880
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4881
	void __iomem *ioaddr = tp->mmio_addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4882
	unsigned long flags;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4883
	u32 mc_filter[2];	/* Multicast hash filter */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4884
	int rx_mode;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4885
	u32 tmp = 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4886
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4887
	if (dev->flags & IFF_PROMISC) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4888
		/* Unconditionally log net taps. */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4889
		netif_notice(tp, link, dev, "Promiscuous mode enabled\n");
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4890
		rx_mode =
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4891
		    AcceptBroadcast | AcceptMulticast | AcceptMyPhys |
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4892
		    AcceptAllPhys;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4893
		mc_filter[1] = mc_filter[0] = 0xffffffff;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4894
	} else if ((netdev_mc_count(dev) > multicast_filter_limit) ||
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4895
		   (dev->flags & IFF_ALLMULTI)) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4896
		/* Too many to filter perfectly -- accept all multicasts. */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4897
		rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4898
		mc_filter[1] = mc_filter[0] = 0xffffffff;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4899
	} else {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4900
		struct netdev_hw_addr *ha;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4901
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4902
		rx_mode = AcceptBroadcast | AcceptMyPhys;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4903
		mc_filter[1] = mc_filter[0] = 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4904
		netdev_for_each_mc_addr(ha, dev) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4905
			int bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4906
			mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4907
			rx_mode |= AcceptMulticast;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4908
		}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4909
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4910
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4911
	spin_lock_irqsave(&tp->lock, flags);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4912
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4913
	tmp = rtl8169_rx_config | rx_mode |
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4914
	      (RTL_R32(RxConfig) & rtl_chip_info[tp->chipset].RxConfigMask);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4915
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4916
	if (tp->mac_version > RTL_GIGA_MAC_VER_06) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4917
		u32 data = mc_filter[0];
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4918
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4919
		mc_filter[0] = swab32(mc_filter[1]);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4920
		mc_filter[1] = swab32(data);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4921
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4922
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4923
	RTL_W32(MAR0 + 4, mc_filter[1]);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4924
	RTL_W32(MAR0 + 0, mc_filter[0]);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4925
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4926
	RTL_W32(RxConfig, tmp);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4927
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4928
	spin_unlock_irqrestore(&tp->lock, flags);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4929
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4930
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4931
/**
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4932
 *  rtl8169_get_stats - Get rtl8169 read/write statistics
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4933
 *  @dev: The Ethernet Device to get statistics for
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4934
 *
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4935
 *  Get TX/RX statistics for rtl8169
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4936
 */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4937
static struct net_device_stats *rtl8169_get_stats(struct net_device *dev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4938
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4939
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4940
	void __iomem *ioaddr = tp->mmio_addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4941
	unsigned long flags;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4942
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4943
	if (netif_running(dev)) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4944
		spin_lock_irqsave(&tp->lock, flags);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4945
		rtl8169_rx_missed(dev, ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4946
		spin_unlock_irqrestore(&tp->lock, flags);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4947
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4948
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4949
	return &dev->stats;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4950
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4951
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4952
static void rtl8169_net_suspend(struct net_device *dev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4953
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4954
	if (!netif_running(dev))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4955
		return;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4956
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4957
	netif_device_detach(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4958
	netif_stop_queue(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4959
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4960
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4961
#ifdef CONFIG_PM
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4962
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4963
static int rtl8169_suspend(struct device *device)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4964
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4965
	struct pci_dev *pdev = to_pci_dev(device);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4966
	struct net_device *dev = pci_get_drvdata(pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4967
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4968
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4969
	if (tp->ecdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4970
		return -EBUSY;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4971
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4972
	rtl8169_net_suspend(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4973
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4974
	return 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4975
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4976
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4977
static void __rtl8169_resume(struct net_device *dev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4978
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4979
	netif_device_attach(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4980
	rtl8169_schedule_work(dev, rtl8169_reset_task);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4981
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4982
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4983
static int rtl8169_resume(struct device *device)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4984
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4985
	struct pci_dev *pdev = to_pci_dev(device);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4986
	struct net_device *dev = pci_get_drvdata(pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4987
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4988
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4989
	if (tp->ecdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4990
		return -EBUSY;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4991
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4992
	if (netif_running(dev))
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4993
		__rtl8169_resume(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4994
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4995
	return 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4996
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4997
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4998
static int rtl8169_runtime_suspend(struct device *device)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4999
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5000
	struct pci_dev *pdev = to_pci_dev(device);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5001
	struct net_device *dev = pci_get_drvdata(pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5002
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5003
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5004
	if (!tp->TxDescArray)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5005
		return 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5006
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5007
	spin_lock_irq(&tp->lock);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5008
	tp->saved_wolopts = __rtl8169_get_wol(tp);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5009
	__rtl8169_set_wol(tp, WAKE_ANY);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5010
	spin_unlock_irq(&tp->lock);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5011
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5012
	rtl8169_net_suspend(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5013
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5014
	return 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5015
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5016
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5017
static int rtl8169_runtime_resume(struct device *device)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5018
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5019
	struct pci_dev *pdev = to_pci_dev(device);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5020
	struct net_device *dev = pci_get_drvdata(pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5021
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5022
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5023
	if (!tp->TxDescArray)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5024
		return 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5025
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5026
	spin_lock_irq(&tp->lock);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5027
	__rtl8169_set_wol(tp, tp->saved_wolopts);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5028
	tp->saved_wolopts = 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5029
	spin_unlock_irq(&tp->lock);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5030
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5031
	__rtl8169_resume(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5032
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5033
	return 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5034
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5035
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5036
static int rtl8169_runtime_idle(struct device *device)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5037
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5038
	struct pci_dev *pdev = to_pci_dev(device);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5039
	struct net_device *dev = pci_get_drvdata(pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5040
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5041
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5042
	if (!tp->TxDescArray)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5043
		return 0;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5044
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5045
	rtl8169_check_link_status(dev, tp, tp->mmio_addr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5046
	return -EBUSY;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5047
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5048
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5049
static const struct dev_pm_ops rtl8169_pm_ops = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5050
	.suspend = rtl8169_suspend,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5051
	.resume = rtl8169_resume,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5052
	.freeze = rtl8169_suspend,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5053
	.thaw = rtl8169_resume,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5054
	.poweroff = rtl8169_suspend,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5055
	.restore = rtl8169_resume,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5056
	.runtime_suspend = rtl8169_runtime_suspend,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5057
	.runtime_resume = rtl8169_runtime_resume,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5058
	.runtime_idle = rtl8169_runtime_idle,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5059
};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5060
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5061
#define RTL8169_PM_OPS	(&rtl8169_pm_ops)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5062
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5063
#else /* !CONFIG_PM */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5064
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5065
#define RTL8169_PM_OPS	NULL
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5066
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5067
#endif /* !CONFIG_PM */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5068
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5069
static void rtl_shutdown(struct pci_dev *pdev)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5070
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5071
	struct net_device *dev = pci_get_drvdata(pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5072
	struct rtl8169_private *tp = netdev_priv(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5073
	void __iomem *ioaddr = tp->mmio_addr;
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5074
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5075
	rtl8169_net_suspend(dev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5076
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5077
	/* restore original MAC address */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5078
	rtl_rar_set(tp, dev->perm_addr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5079
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5080
	spin_lock_irq(&tp->lock);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5081
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5082
	rtl8169_asic_down(ioaddr);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5083
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5084
	spin_unlock_irq(&tp->lock);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5085
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5086
	if (system_state == SYSTEM_POWER_OFF) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5087
		/* WoL fails with some 8168 when the receiver is disabled. */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5088
		if (tp->features & RTL_FEATURE_WOL) {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5089
			pci_clear_master(pdev);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5090
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5091
			RTL_W8(ChipCmd, CmdRxEnb);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5092
			/* PCI commit */
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5093
			RTL_R8(ChipCmd);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5094
		}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5095
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5096
		pci_wake_from_d3(pdev, true);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5097
		pci_set_power_state(pdev, PCI_D3hot);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5098
	}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5099
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5100
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5101
static struct pci_driver rtl8169_pci_driver = {
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5102
	.name		= MODULENAME,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5103
	.id_table	= rtl8169_pci_tbl,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5104
	.probe		= rtl8169_init_one,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5105
	.remove		= __devexit_p(rtl8169_remove_one),
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5106
	.shutdown	= rtl_shutdown,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5107
	.driver.pm	= RTL8169_PM_OPS,
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5108
};
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5109
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5110
static int __init rtl8169_init_module(void)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5111
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5112
	return pci_register_driver(&rtl8169_pci_driver);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5113
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5114
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5115
static void __exit rtl8169_cleanup_module(void)
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5116
{
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5117
	pci_unregister_driver(&rtl8169_pci_driver);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5118
}
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5119
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5120
module_init(rtl8169_init_module);
ec3420474c5c Added r8169 driver for 2.6.35.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5121
module_exit(rtl8169_cleanup_module);