devices/r8169-2.6.29-orig.c
author Dominik Staubli <ch1010252@ch10pc423>
Thu, 21 Jan 2010 11:09:31 +0100
changeset 1798 e7733f825982
parent 1515 e722e0ac5d28
permissions -rw-r--r--
Domain datagram working counter calculation bugfix: increment expected wc for a given slave & direction just once for each datagram
This bug occurs if you configure more than one SM in the same direction on the same slave
1515
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
 * r8169.c: RealTek 8169/8168/8101 ethernet driver.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
 *
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     4
 * Copyright (c) 2002 ShuChen <shuchen@realtek.com.tw>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     5
 * Copyright (c) 2003 - 2007 Francois Romieu <romieu@fr.zoreil.com>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     6
 * Copyright (c) a lot of people too. Please respect their work.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     7
 *
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     8
 * See MAINTAINERS file for support contact information.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     9
 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    10
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    11
#include <linux/module.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    12
#include <linux/moduleparam.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    13
#include <linux/pci.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    14
#include <linux/netdevice.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    15
#include <linux/etherdevice.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    16
#include <linux/delay.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    17
#include <linux/ethtool.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    18
#include <linux/mii.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    19
#include <linux/if_vlan.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
#include <linux/crc32.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
#include <linux/in.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    22
#include <linux/ip.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    23
#include <linux/tcp.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    24
#include <linux/init.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    25
#include <linux/dma-mapping.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    26
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    27
#include <asm/system.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
#include <asm/io.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
#include <asm/irq.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
#define RTL8169_VERSION "2.3LK-NAPI"
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
#define MODULENAME "r8169"
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
#define PFX MODULENAME ": "
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
#ifdef RTL8169_DEBUG
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
#define assert(expr) \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    37
	if (!(expr)) {					\
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    38
		printk( "Assertion failed! %s,%s,%s,line=%d\n",	\
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
		#expr,__FILE__,__func__,__LINE__);		\
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
#define dprintk(fmt, args...) \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
	do { printk(KERN_DEBUG PFX fmt, ## args); } while (0)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
#else
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
#define assert(expr) do {} while (0)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
#define dprintk(fmt, args...)	do {} while (0)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    46
#endif /* RTL8169_DEBUG */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    47
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    48
#define R8169_MSG_DEFAULT \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    49
	(NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_IFUP | NETIF_MSG_IFDOWN)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    50
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    51
#define TX_BUFFS_AVAIL(tp) \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
	(tp->dirty_tx + NUM_TX_DESC - tp->cur_tx - 1)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    53
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    54
/* Maximum events (Rx packets, etc.) to handle at each interrupt. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    55
static const int max_interrupt_work = 20;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    56
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    57
/* Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    58
   The RTL chips use a 64 element hash table based on the Ethernet CRC. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
static const int multicast_filter_limit = 32;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
/* MAC address length */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
#define MAC_ADDR_LEN	6
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    63
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    64
#define MAX_READ_REQUEST_SHIFT	12
e722e0ac5d28 Added r8169 driver for 2.6.29.
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. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    66
#define RX_DMA_BURST	6	/* Maximum PCI burst, '6' is 1024 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    67
#define TX_DMA_BURST	6	/* Maximum PCI burst, '6' is 1024 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    68
#define EarlyTxThld	0x3F	/* 0x3F means NO early transmit */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    69
#define RxPacketMaxSize	0x3FE8	/* 16K - 1 - ETH_HLEN - VLAN - CRC... */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
#define SafeMtu		0x1c20	/* ... actually life sucks beyond ~7k */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    71
#define InterFrameGap	0x03	/* 3 means InterFrameGap = the shortest one */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    73
#define R8169_REGS_SIZE		256
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    74
#define R8169_NAPI_WEIGHT	64
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    75
#define NUM_TX_DESC	64	/* Number of Tx descriptor registers */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    76
#define NUM_RX_DESC	256	/* Number of Rx descriptor registers */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    77
#define RX_BUF_SIZE	1536	/* Rx Buffer size */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
#define R8169_TX_RING_BYTES	(NUM_TX_DESC * sizeof(struct TxDesc))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
#define R8169_RX_RING_BYTES	(NUM_RX_DESC * sizeof(struct RxDesc))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    80
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    81
#define RTL8169_TX_TIMEOUT	(6*HZ)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    82
#define RTL8169_PHY_TIMEOUT	(10*HZ)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    83
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    84
#define RTL_EEPROM_SIG		cpu_to_le32(0x8129)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    85
#define RTL_EEPROM_SIG_MASK	cpu_to_le32(0xffff)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
#define RTL_EEPROM_SIG_ADDR	0x0000
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    87
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    88
/* write/read MMIO register */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
#define RTL_W8(reg, val8)	writeb ((val8), ioaddr + (reg))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    90
#define RTL_W16(reg, val16)	writew ((val16), ioaddr + (reg))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    91
#define RTL_W32(reg, val32)	writel ((val32), ioaddr + (reg))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
#define RTL_R8(reg)		readb (ioaddr + (reg))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    93
#define RTL_R16(reg)		readw (ioaddr + (reg))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    94
#define RTL_R32(reg)		((unsigned long) readl (ioaddr + (reg)))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    95
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
enum mac_version {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    97
	RTL_GIGA_MAC_VER_01 = 0x01, // 8169
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    98
	RTL_GIGA_MAC_VER_02 = 0x02, // 8169S
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    99
	RTL_GIGA_MAC_VER_03 = 0x03, // 8110S
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   100
	RTL_GIGA_MAC_VER_04 = 0x04, // 8169SB
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   101
	RTL_GIGA_MAC_VER_05 = 0x05, // 8110SCd
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   102
	RTL_GIGA_MAC_VER_06 = 0x06, // 8110SCe
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   103
	RTL_GIGA_MAC_VER_07 = 0x07, // 8102e
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   104
	RTL_GIGA_MAC_VER_08 = 0x08, // 8102e
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   105
	RTL_GIGA_MAC_VER_09 = 0x09, // 8102e
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   106
	RTL_GIGA_MAC_VER_10 = 0x0a, // 8101e
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   107
	RTL_GIGA_MAC_VER_11 = 0x0b, // 8168Bb
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   108
	RTL_GIGA_MAC_VER_12 = 0x0c, // 8168Be
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   109
	RTL_GIGA_MAC_VER_13 = 0x0d, // 8101Eb
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   110
	RTL_GIGA_MAC_VER_14 = 0x0e, // 8101 ?
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   111
	RTL_GIGA_MAC_VER_15 = 0x0f, // 8101 ?
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   112
	RTL_GIGA_MAC_VER_16 = 0x11, // 8101Ec
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   113
	RTL_GIGA_MAC_VER_17 = 0x10, // 8168Bf
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   114
	RTL_GIGA_MAC_VER_18 = 0x12, // 8168CP
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   115
	RTL_GIGA_MAC_VER_19 = 0x13, // 8168C
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
	RTL_GIGA_MAC_VER_20 = 0x14, // 8168C
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
	RTL_GIGA_MAC_VER_21 = 0x15, // 8168C
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   118
	RTL_GIGA_MAC_VER_22 = 0x16, // 8168C
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
	RTL_GIGA_MAC_VER_23 = 0x17, // 8168CP
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
	RTL_GIGA_MAC_VER_24 = 0x18, // 8168CP
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   121
	RTL_GIGA_MAC_VER_25 = 0x19  // 8168D
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   123
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   124
#define _R(NAME,MAC,MASK) \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
	{ .name = NAME, .mac_version = MAC, .RxConfigMask = MASK }
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   126
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   127
static const struct {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   128
	const char *name;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   129
	u8 mac_version;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   130
	u32 RxConfigMask;	/* Clears the bits supported by this chip */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   131
} rtl_chip_info[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   132
	_R("RTL8169",		RTL_GIGA_MAC_VER_01, 0xff7e1880), // 8169
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   133
	_R("RTL8169s",		RTL_GIGA_MAC_VER_02, 0xff7e1880), // 8169S
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   134
	_R("RTL8110s",		RTL_GIGA_MAC_VER_03, 0xff7e1880), // 8110S
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   135
	_R("RTL8169sb/8110sb",	RTL_GIGA_MAC_VER_04, 0xff7e1880), // 8169SB
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   136
	_R("RTL8169sc/8110sc",	RTL_GIGA_MAC_VER_05, 0xff7e1880), // 8110SCd
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   137
	_R("RTL8169sc/8110sc",	RTL_GIGA_MAC_VER_06, 0xff7e1880), // 8110SCe
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   138
	_R("RTL8102e",		RTL_GIGA_MAC_VER_07, 0xff7e1880), // PCI-E
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   139
	_R("RTL8102e",		RTL_GIGA_MAC_VER_08, 0xff7e1880), // PCI-E
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   140
	_R("RTL8102e",		RTL_GIGA_MAC_VER_09, 0xff7e1880), // PCI-E
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   141
	_R("RTL8101e",		RTL_GIGA_MAC_VER_10, 0xff7e1880), // PCI-E
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   142
	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_11, 0xff7e1880), // PCI-E
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   143
	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_12, 0xff7e1880), // PCI-E
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   144
	_R("RTL8101e",		RTL_GIGA_MAC_VER_13, 0xff7e1880), // PCI-E 8139
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   145
	_R("RTL8100e",		RTL_GIGA_MAC_VER_14, 0xff7e1880), // PCI-E 8139
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   146
	_R("RTL8100e",		RTL_GIGA_MAC_VER_15, 0xff7e1880), // PCI-E 8139
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   147
	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_17, 0xff7e1880), // PCI-E
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   148
	_R("RTL8101e",		RTL_GIGA_MAC_VER_16, 0xff7e1880), // PCI-E
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   149
	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_18, 0xff7e1880), // PCI-E
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   150
	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_19, 0xff7e1880), // PCI-E
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   151
	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_20, 0xff7e1880), // PCI-E
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   152
	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_21, 0xff7e1880), // PCI-E
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   153
	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_22, 0xff7e1880), // PCI-E
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   154
	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_23, 0xff7e1880), // PCI-E
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   155
	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_24, 0xff7e1880), // PCI-E
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   156
	_R("RTL8168d/8111d",	RTL_GIGA_MAC_VER_25, 0xff7e1880)  // PCI-E
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   157
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   158
#undef _R
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   159
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   160
enum cfg_version {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   161
	RTL_CFG_0 = 0x00,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   162
	RTL_CFG_1,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   163
	RTL_CFG_2
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   164
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   165
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
static void rtl_hw_start_8169(struct net_device *);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   167
static void rtl_hw_start_8168(struct net_device *);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
static void rtl_hw_start_8101(struct net_device *);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   169
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   170
static struct pci_device_id rtl8169_pci_tbl[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   171
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8129), 0, 0, RTL_CFG_0 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   172
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8136), 0, 0, RTL_CFG_2 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   173
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8167), 0, 0, RTL_CFG_0 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   174
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8168), 0, 0, RTL_CFG_1 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   175
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8169), 0, 0, RTL_CFG_0 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   176
	{ PCI_DEVICE(PCI_VENDOR_ID_DLINK,	0x4300), 0, 0, RTL_CFG_0 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   177
	{ PCI_DEVICE(PCI_VENDOR_ID_AT,		0xc107), 0, 0, RTL_CFG_0 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   178
	{ PCI_DEVICE(0x16ec,			0x0116), 0, 0, RTL_CFG_0 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   179
	{ PCI_VENDOR_ID_LINKSYS,		0x1032,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   180
		PCI_ANY_ID, 0x0024, 0, 0, RTL_CFG_0 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   181
	{ 0x0001,				0x8168,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   182
		PCI_ANY_ID, 0x2410, 0, 0, RTL_CFG_2 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   183
	{0,},
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   184
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   185
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   187
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   188
static int rx_copybreak = 200;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   189
static int use_dac;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   190
static struct {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   191
	u32 msg_enable;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   192
} debug = { -1 };
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   194
enum rtl_registers {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   195
	MAC0		= 0,	/* Ethernet hardware address. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
	MAC4		= 4,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
	MAR0		= 8,	/* Multicast filter. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   198
	CounterAddrLow		= 0x10,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
	CounterAddrHigh		= 0x14,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   200
	TxDescStartAddrLow	= 0x20,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   201
	TxDescStartAddrHigh	= 0x24,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   202
	TxHDescStartAddrLow	= 0x28,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   203
	TxHDescStartAddrHigh	= 0x2c,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   204
	FLASH		= 0x30,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   205
	ERSR		= 0x36,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   206
	ChipCmd		= 0x37,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   207
	TxPoll		= 0x38,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   208
	IntrMask	= 0x3c,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   209
	IntrStatus	= 0x3e,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   210
	TxConfig	= 0x40,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   211
	RxConfig	= 0x44,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   212
	RxMissed	= 0x4c,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   213
	Cfg9346		= 0x50,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   214
	Config0		= 0x51,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   215
	Config1		= 0x52,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   216
	Config2		= 0x53,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   217
	Config3		= 0x54,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   218
	Config4		= 0x55,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   219
	Config5		= 0x56,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   220
	MultiIntr	= 0x5c,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   221
	PHYAR		= 0x60,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   222
	PHYstatus	= 0x6c,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   223
	RxMaxSize	= 0xda,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   224
	CPlusCmd	= 0xe0,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   225
	IntrMitigate	= 0xe2,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   226
	RxDescAddrLow	= 0xe4,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   227
	RxDescAddrHigh	= 0xe8,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   228
	EarlyTxThres	= 0xec,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   229
	FuncEvent	= 0xf0,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   230
	FuncEventMask	= 0xf4,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   231
	FuncPresetState	= 0xf8,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   232
	FuncForceEvent	= 0xfc,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   233
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   234
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   235
enum rtl8110_registers {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   236
	TBICSR			= 0x64,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   237
	TBI_ANAR		= 0x68,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   238
	TBI_LPAR		= 0x6a,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   239
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   240
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   241
enum rtl8168_8101_registers {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   242
	CSIDR			= 0x64,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   243
	CSIAR			= 0x68,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   244
#define	CSIAR_FLAG			0x80000000
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   245
#define	CSIAR_WRITE_CMD			0x80000000
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   246
#define	CSIAR_BYTE_ENABLE		0x0f
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   247
#define	CSIAR_BYTE_ENABLE_SHIFT		12
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   248
#define	CSIAR_ADDR_MASK			0x0fff
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   250
	EPHYAR			= 0x80,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   251
#define	EPHYAR_FLAG			0x80000000
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   252
#define	EPHYAR_WRITE_CMD		0x80000000
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   253
#define	EPHYAR_REG_MASK			0x1f
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   254
#define	EPHYAR_REG_SHIFT		16
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   255
#define	EPHYAR_DATA_MASK		0xffff
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   256
	DBG_REG			= 0xd1,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   257
#define	FIX_NAK_1			(1 << 4)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   258
#define	FIX_NAK_2			(1 << 3)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   259
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   260
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
enum rtl_register_content {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
	/* InterruptStatusBits */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
	SYSErr		= 0x8000,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   264
	PCSTimeout	= 0x4000,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   265
	SWInt		= 0x0100,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   266
	TxDescUnavail	= 0x0080,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   267
	RxFIFOOver	= 0x0040,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   268
	LinkChg		= 0x0020,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   269
	RxOverflow	= 0x0010,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   270
	TxErr		= 0x0008,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   271
	TxOK		= 0x0004,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   272
	RxErr		= 0x0002,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   273
	RxOK		= 0x0001,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   275
	/* RxStatusDesc */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   276
	RxFOVF	= (1 << 23),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
	RxRWT	= (1 << 22),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
	RxRES	= (1 << 21),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
	RxRUNT	= (1 << 20),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   280
	RxCRC	= (1 << 19),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   281
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   282
	/* ChipCmdBits */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   283
	CmdReset	= 0x10,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   284
	CmdRxEnb	= 0x08,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   285
	CmdTxEnb	= 0x04,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   286
	RxBufEmpty	= 0x01,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   287
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   288
	/* TXPoll register p.5 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   289
	HPQ		= 0x80,		/* Poll cmd on the high prio queue */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   290
	NPQ		= 0x40,		/* Poll cmd on the low prio queue */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   291
	FSWInt		= 0x01,		/* Forced software interrupt */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   292
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   293
	/* Cfg9346Bits */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   294
	Cfg9346_Lock	= 0x00,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   295
	Cfg9346_Unlock	= 0xc0,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   296
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   297
	/* rx_mode_bits */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   298
	AcceptErr	= 0x20,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   299
	AcceptRunt	= 0x10,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   300
	AcceptBroadcast	= 0x08,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   301
	AcceptMulticast	= 0x04,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   302
	AcceptMyPhys	= 0x02,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   303
	AcceptAllPhys	= 0x01,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   304
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   305
	/* RxConfigBits */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   306
	RxCfgFIFOShift	= 13,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   307
	RxCfgDMAShift	=  8,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   308
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   309
	/* TxConfigBits */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   310
	TxInterFrameGapShift = 24,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   311
	TxDMAShift = 8,	/* DMA burst value (0-7) is shift this many bits */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   312
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   313
	/* Config1 register p.24 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   314
	LEDS1		= (1 << 7),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   315
	LEDS0		= (1 << 6),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   316
	MSIEnable	= (1 << 5),	/* Enable Message Signaled Interrupt */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   317
	Speed_down	= (1 << 4),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   318
	MEMMAP		= (1 << 3),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   319
	IOMAP		= (1 << 2),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   320
	VPD		= (1 << 1),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   321
	PMEnable	= (1 << 0),	/* Power Management Enable */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   322
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   323
	/* Config2 register p. 25 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   324
	PCI_Clock_66MHz = 0x01,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   325
	PCI_Clock_33MHz = 0x00,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   326
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   327
	/* Config3 register p.25 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   328
	MagicPacket	= (1 << 5),	/* Wake up when receives a Magic Packet */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   329
	LinkUp		= (1 << 4),	/* Wake up when the cable connection is re-established */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   330
	Beacon_en	= (1 << 0),	/* 8168 only. Reserved in the 8168b */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   331
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   332
	/* Config5 register p.27 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   333
	BWF		= (1 << 6),	/* Accept Broadcast wakeup frame */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   334
	MWF		= (1 << 5),	/* Accept Multicast wakeup frame */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   335
	UWF		= (1 << 4),	/* Accept Unicast wakeup frame */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   336
	LanWake		= (1 << 1),	/* LanWake enable/disable */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   337
	PMEStatus	= (1 << 0),	/* PME status can be reset by PCI RST# */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   338
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   339
	/* TBICSR p.28 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   340
	TBIReset	= 0x80000000,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   341
	TBILoopback	= 0x40000000,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   342
	TBINwEnable	= 0x20000000,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   343
	TBINwRestart	= 0x10000000,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   344
	TBILinkOk	= 0x02000000,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   345
	TBINwComplete	= 0x01000000,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   346
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   347
	/* CPlusCmd p.31 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   348
	EnableBist	= (1 << 15),	// 8168 8101
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   349
	Mac_dbgo_oe	= (1 << 14),	// 8168 8101
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   350
	Normal_mode	= (1 << 13),	// unused
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
	Force_half_dup	= (1 << 12),	// 8168 8101
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   352
	Force_rxflow_en	= (1 << 11),	// 8168 8101
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   353
	Force_txflow_en	= (1 << 10),	// 8168 8101
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   354
	Cxpl_dbg_sel	= (1 << 9),	// 8168 8101
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   355
	ASF		= (1 << 8),	// 8168 8101
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
	PktCntrDisable	= (1 << 7),	// 8168 8101
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
	Mac_dbgo_sel	= 0x001c,	// 8168
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   358
	RxVlan		= (1 << 6),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
	RxChkSum	= (1 << 5),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
	PCIDAC		= (1 << 4),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   361
	PCIMulRW	= (1 << 3),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
	INTT_0		= 0x0000,	// 8168
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   363
	INTT_1		= 0x0001,	// 8168
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
	INTT_2		= 0x0002,	// 8168
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   365
	INTT_3		= 0x0003,	// 8168
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   366
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   367
	/* rtl8169_PHYstatus */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   368
	TBI_Enable	= 0x80,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   369
	TxFlowCtrl	= 0x40,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
	RxFlowCtrl	= 0x20,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   371
	_1000bpsF	= 0x10,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
	_100bps		= 0x08,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
	_10bps		= 0x04,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   374
	LinkStatus	= 0x02,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   375
	FullDup		= 0x01,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
	/* _TBICSRBit */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   378
	TBILinkOK	= 0x02000000,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   379
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
	/* DumpCounterCommand */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
	CounterDump	= 0x8,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   382
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   383
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   384
enum desc_status_bit {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   385
	DescOwn		= (1 << 31), /* Descriptor is owned by NIC */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   386
	RingEnd		= (1 << 30), /* End of descriptor ring */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   387
	FirstFrag	= (1 << 29), /* First segment of a packet */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   388
	LastFrag	= (1 << 28), /* Final segment of a packet */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   389
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   390
	/* Tx private */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
	LargeSend	= (1 << 27), /* TCP Large Send Offload (TSO) */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   392
	MSSShift	= 16,        /* MSS value position */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   393
	MSSMask		= 0xfff,     /* MSS value + LargeSend bit: 12 bits */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   394
	IPCS		= (1 << 18), /* Calculate IP checksum */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   395
	UDPCS		= (1 << 17), /* Calculate UDP/IP checksum */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   396
	TCPCS		= (1 << 16), /* Calculate TCP/IP checksum */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   397
	TxVlanTag	= (1 << 17), /* Add VLAN tag */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   398
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
	/* Rx private */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   400
	PID1		= (1 << 18), /* Protocol ID bit 1/2 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   401
	PID0		= (1 << 17), /* Protocol ID bit 2/2 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   402
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   403
#define RxProtoUDP	(PID1)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   404
#define RxProtoTCP	(PID0)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
#define RxProtoIP	(PID1 | PID0)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   406
#define RxProtoMask	RxProtoIP
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   407
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   408
	IPFail		= (1 << 16), /* IP checksum failed */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   409
	UDPFail		= (1 << 15), /* UDP/IP checksum failed */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   410
	TCPFail		= (1 << 14), /* TCP/IP checksum failed */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   411
	RxVlanTag	= (1 << 16), /* VLAN tag available */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   412
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   413
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   414
#define RsvdMask	0x3fffc000
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   415
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   416
struct TxDesc {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   417
	__le32 opts1;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   418
	__le32 opts2;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   419
	__le64 addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   420
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   421
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   422
struct RxDesc {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   423
	__le32 opts1;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   424
	__le32 opts2;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   425
	__le64 addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   426
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   427
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   428
struct ring_info {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   429
	struct sk_buff	*skb;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   430
	u32		len;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   431
	u8		__pad[sizeof(void *) - sizeof(u32)];
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   432
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   433
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   434
enum features {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   435
	RTL_FEATURE_WOL		= (1 << 0),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   436
	RTL_FEATURE_MSI		= (1 << 1),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   437
	RTL_FEATURE_GMII	= (1 << 2),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   438
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   439
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   440
struct rtl8169_counters {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   441
	__le64	tx_packets;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   442
	__le64	rx_packets;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   443
	__le64	tx_errors;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   444
	__le32	rx_errors;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   445
	__le16	rx_missed;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   446
	__le16	align_errors;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   447
	__le32	tx_one_collision;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   448
	__le32	tx_multi_collision;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   449
	__le64	rx_unicast;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   450
	__le64	rx_broadcast;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   451
	__le32	rx_multicast;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   452
	__le16	tx_aborted;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   453
	__le16	tx_underun;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   454
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   455
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   456
struct rtl8169_private {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   457
	void __iomem *mmio_addr;	/* memory map physical address */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   458
	struct pci_dev *pci_dev;	/* Index of PCI device */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
	struct net_device *dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   460
	struct napi_struct napi;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   461
	spinlock_t lock;		/* spin lock flag */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   462
	u32 msg_enable;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   463
	int chipset;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   464
	int mac_version;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   465
	u32 cur_rx; /* Index into the Rx descriptor buffer of next Rx pkt. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   466
	u32 cur_tx; /* Index into the Tx descriptor buffer of next Rx pkt. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   467
	u32 dirty_rx;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   468
	u32 dirty_tx;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   469
	struct TxDesc *TxDescArray;	/* 256-aligned Tx descriptor ring */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   470
	struct RxDesc *RxDescArray;	/* 256-aligned Rx descriptor ring */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   471
	dma_addr_t TxPhyAddr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   472
	dma_addr_t RxPhyAddr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   473
	struct sk_buff *Rx_skbuff[NUM_RX_DESC];	/* Rx data buffers */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   474
	struct ring_info tx_skb[NUM_TX_DESC];	/* Tx data buffers */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   475
	unsigned align;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   476
	unsigned rx_buf_sz;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   477
	struct timer_list timer;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   478
	u16 cp_cmd;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   479
	u16 intr_event;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   480
	u16 napi_event;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   481
	u16 intr_mask;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   482
	int phy_auto_nego_reg;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   483
	int phy_1000_ctrl_reg;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   484
#ifdef CONFIG_R8169_VLAN
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   485
	struct vlan_group *vlgrp;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   486
#endif
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   487
	int (*set_speed)(struct net_device *, u8 autoneg, u16 speed, u8 duplex);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   488
	int (*get_settings)(struct net_device *, struct ethtool_cmd *);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   489
	void (*phy_reset_enable)(void __iomem *);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   490
	void (*hw_start)(struct net_device *);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   491
	unsigned int (*phy_reset_pending)(void __iomem *);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   492
	unsigned int (*link_ok)(void __iomem *);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   493
	int (*do_ioctl)(struct rtl8169_private *tp, struct mii_ioctl_data *data, int cmd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   494
	int pcie_cap;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   495
	struct delayed_work task;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   496
	unsigned features;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   497
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   498
	struct mii_if_info mii;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   499
	struct rtl8169_counters counters;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   500
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   501
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   502
MODULE_AUTHOR("Realtek and the Linux r8169 crew <netdev@vger.kernel.org>");
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   503
MODULE_DESCRIPTION("RealTek RTL-8169 Gigabit Ethernet driver");
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   504
module_param(rx_copybreak, int, 0);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   505
MODULE_PARM_DESC(rx_copybreak, "Copy breakpoint for copy-only-tiny-frames");
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   506
module_param(use_dac, int, 0);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   507
MODULE_PARM_DESC(use_dac, "Enable PCI DAC. Unsafe on 32 bit PCI slot.");
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   508
module_param_named(debug, debug.msg_enable, int, 0);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   509
MODULE_PARM_DESC(debug, "Debug verbosity level (0=none, ..., 16=all)");
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   510
MODULE_LICENSE("GPL");
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   511
MODULE_VERSION(RTL8169_VERSION);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   512
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   513
static int rtl8169_open(struct net_device *dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   514
static int rtl8169_start_xmit(struct sk_buff *skb, struct net_device *dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   515
static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   516
static int rtl8169_init_ring(struct net_device *dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   517
static void rtl_hw_start(struct net_device *dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   518
static int rtl8169_close(struct net_device *dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   519
static void rtl_set_rx_mode(struct net_device *dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   520
static void rtl8169_tx_timeout(struct net_device *dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   521
static struct net_device_stats *rtl8169_get_stats(struct net_device *dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   522
static int rtl8169_rx_interrupt(struct net_device *, struct rtl8169_private *,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   523
				void __iomem *, u32 budget);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   524
static int rtl8169_change_mtu(struct net_device *dev, int new_mtu);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   525
static void rtl8169_down(struct net_device *dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   526
static void rtl8169_rx_clear(struct rtl8169_private *tp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   527
static int rtl8169_poll(struct napi_struct *napi, int budget);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   528
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   529
static const unsigned int rtl8169_rx_config =
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   530
	(RX_FIFO_THRESH << RxCfgFIFOShift) | (RX_DMA_BURST << RxCfgDMAShift);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   531
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   532
static void mdio_write(void __iomem *ioaddr, int reg_addr, int value)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   533
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   534
	int i;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   535
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   536
	RTL_W32(PHYAR, 0x80000000 | (reg_addr & 0x1f) << 16 | (value & 0xffff));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   537
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   538
	for (i = 20; i > 0; i--) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   539
		/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   540
		 * Check if the RTL8169 has completed writing to the specified
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   541
		 * MII register.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   542
		 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   543
		if (!(RTL_R32(PHYAR) & 0x80000000))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   544
			break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   545
		udelay(25);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   546
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   547
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   548
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   549
static int mdio_read(void __iomem *ioaddr, int reg_addr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   550
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   551
	int i, value = -1;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   552
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   553
	RTL_W32(PHYAR, 0x0 | (reg_addr & 0x1f) << 16);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   554
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   555
	for (i = 20; i > 0; i--) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   556
		/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   557
		 * Check if the RTL8169 has completed retrieving data from
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   558
		 * the specified MII register.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   559
		 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   560
		if (RTL_R32(PHYAR) & 0x80000000) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   561
			value = RTL_R32(PHYAR) & 0xffff;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   562
			break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   563
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   564
		udelay(25);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   565
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   566
	return value;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   567
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   568
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   569
static void mdio_patch(void __iomem *ioaddr, int reg_addr, int value)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   570
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   571
	mdio_write(ioaddr, reg_addr, mdio_read(ioaddr, reg_addr) | value);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   572
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   573
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   574
static void rtl_mdio_write(struct net_device *dev, int phy_id, int location,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   575
			   int val)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   576
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   577
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   578
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   579
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   580
	mdio_write(ioaddr, location, val);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   581
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   582
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   583
static int rtl_mdio_read(struct net_device *dev, int phy_id, int location)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   584
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   585
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   586
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   587
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   588
	return mdio_read(ioaddr, location);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   589
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   590
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   591
static void rtl_ephy_write(void __iomem *ioaddr, int reg_addr, int value)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   592
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   593
	unsigned int i;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   594
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   595
	RTL_W32(EPHYAR, EPHYAR_WRITE_CMD | (value & EPHYAR_DATA_MASK) |
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   596
		(reg_addr & EPHYAR_REG_MASK) << EPHYAR_REG_SHIFT);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   597
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   598
	for (i = 0; i < 100; i++) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   599
		if (!(RTL_R32(EPHYAR) & EPHYAR_FLAG))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   600
			break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   601
		udelay(10);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   602
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   603
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   604
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   605
static u16 rtl_ephy_read(void __iomem *ioaddr, int reg_addr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   606
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   607
	u16 value = 0xffff;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   608
	unsigned int i;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   609
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   610
	RTL_W32(EPHYAR, (reg_addr & EPHYAR_REG_MASK) << EPHYAR_REG_SHIFT);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   611
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   612
	for (i = 0; i < 100; i++) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   613
		if (RTL_R32(EPHYAR) & EPHYAR_FLAG) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   614
			value = RTL_R32(EPHYAR) & EPHYAR_DATA_MASK;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   615
			break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   616
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   617
		udelay(10);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   618
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   619
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   620
	return value;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   621
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   622
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   623
static void rtl_csi_write(void __iomem *ioaddr, int addr, int value)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   624
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   625
	unsigned int i;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   626
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   627
	RTL_W32(CSIDR, value);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   628
	RTL_W32(CSIAR, CSIAR_WRITE_CMD | (addr & CSIAR_ADDR_MASK) |
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   629
		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   630
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   631
	for (i = 0; i < 100; i++) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   632
		if (!(RTL_R32(CSIAR) & CSIAR_FLAG))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   633
			break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   634
		udelay(10);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   635
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   636
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   637
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   638
static u32 rtl_csi_read(void __iomem *ioaddr, int addr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   639
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   640
	u32 value = ~0x00;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   641
	unsigned int i;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   642
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   643
	RTL_W32(CSIAR, (addr & CSIAR_ADDR_MASK) |
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   644
		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   645
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   646
	for (i = 0; i < 100; i++) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   647
		if (RTL_R32(CSIAR) & CSIAR_FLAG) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   648
			value = RTL_R32(CSIDR);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   649
			break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   650
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   651
		udelay(10);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   652
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   653
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   654
	return value;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   655
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   656
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   657
static void rtl8169_irq_mask_and_ack(void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   658
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   659
	RTL_W16(IntrMask, 0x0000);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   660
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   661
	RTL_W16(IntrStatus, 0xffff);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   662
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   663
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   664
static void rtl8169_asic_down(void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   665
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   666
	RTL_W8(ChipCmd, 0x00);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   667
	rtl8169_irq_mask_and_ack(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   668
	RTL_R16(CPlusCmd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   669
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   670
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   671
static unsigned int rtl8169_tbi_reset_pending(void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   672
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   673
	return RTL_R32(TBICSR) & TBIReset;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   674
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   675
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   676
static unsigned int rtl8169_xmii_reset_pending(void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   677
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   678
	return mdio_read(ioaddr, MII_BMCR) & BMCR_RESET;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   679
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   680
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   681
static unsigned int rtl8169_tbi_link_ok(void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   682
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   683
	return RTL_R32(TBICSR) & TBILinkOk;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   684
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   685
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   686
static unsigned int rtl8169_xmii_link_ok(void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   687
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   688
	return RTL_R8(PHYstatus) & LinkStatus;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   689
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   690
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   691
static void rtl8169_tbi_reset_enable(void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   692
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   693
	RTL_W32(TBICSR, RTL_R32(TBICSR) | TBIReset);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   694
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   695
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   696
static void rtl8169_xmii_reset_enable(void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   697
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   698
	unsigned int val;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   699
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   700
	val = mdio_read(ioaddr, MII_BMCR) | BMCR_RESET;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   701
	mdio_write(ioaddr, MII_BMCR, val & 0xffff);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   702
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   703
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   704
static void rtl8169_check_link_status(struct net_device *dev,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   705
				      struct rtl8169_private *tp,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   706
				      void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   707
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   708
	unsigned long flags;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   709
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   710
	spin_lock_irqsave(&tp->lock, flags);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   711
	if (tp->link_ok(ioaddr)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   712
		netif_carrier_on(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   713
		if (netif_msg_ifup(tp))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   714
			printk(KERN_INFO PFX "%s: link up\n", dev->name);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   715
	} else {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   716
		if (netif_msg_ifdown(tp))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   717
			printk(KERN_INFO PFX "%s: link down\n", dev->name);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   718
		netif_carrier_off(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   719
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   720
	spin_unlock_irqrestore(&tp->lock, flags);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   721
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   722
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   723
static void rtl8169_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   724
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   725
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   726
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   727
	u8 options;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   728
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   729
	wol->wolopts = 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   730
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   731
#define WAKE_ANY (WAKE_PHY | WAKE_MAGIC | WAKE_UCAST | WAKE_BCAST | WAKE_MCAST)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   732
	wol->supported = WAKE_ANY;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   733
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   734
	spin_lock_irq(&tp->lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   735
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   736
	options = RTL_R8(Config1);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   737
	if (!(options & PMEnable))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   738
		goto out_unlock;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   739
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   740
	options = RTL_R8(Config3);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   741
	if (options & LinkUp)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   742
		wol->wolopts |= WAKE_PHY;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   743
	if (options & MagicPacket)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   744
		wol->wolopts |= WAKE_MAGIC;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   745
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   746
	options = RTL_R8(Config5);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   747
	if (options & UWF)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   748
		wol->wolopts |= WAKE_UCAST;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   749
	if (options & BWF)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   750
		wol->wolopts |= WAKE_BCAST;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   751
	if (options & MWF)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   752
		wol->wolopts |= WAKE_MCAST;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   753
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   754
out_unlock:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   755
	spin_unlock_irq(&tp->lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   756
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   757
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   758
static int rtl8169_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   759
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   760
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   761
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   762
	unsigned int i;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   763
	static struct {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   764
		u32 opt;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   765
		u16 reg;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   766
		u8  mask;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   767
	} cfg[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   768
		{ WAKE_ANY,   Config1, PMEnable },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   769
		{ WAKE_PHY,   Config3, LinkUp },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   770
		{ WAKE_MAGIC, Config3, MagicPacket },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   771
		{ WAKE_UCAST, Config5, UWF },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   772
		{ WAKE_BCAST, Config5, BWF },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   773
		{ WAKE_MCAST, Config5, MWF },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   774
		{ WAKE_ANY,   Config5, LanWake }
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   775
	};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   776
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   777
	spin_lock_irq(&tp->lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   778
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   779
	RTL_W8(Cfg9346, Cfg9346_Unlock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   780
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   781
	for (i = 0; i < ARRAY_SIZE(cfg); i++) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   782
		u8 options = RTL_R8(cfg[i].reg) & ~cfg[i].mask;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   783
		if (wol->wolopts & cfg[i].opt)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   784
			options |= cfg[i].mask;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   785
		RTL_W8(cfg[i].reg, options);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   786
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   787
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   788
	RTL_W8(Cfg9346, Cfg9346_Lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   789
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   790
	if (wol->wolopts)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   791
		tp->features |= RTL_FEATURE_WOL;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   792
	else
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   793
		tp->features &= ~RTL_FEATURE_WOL;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   794
	device_set_wakeup_enable(&tp->pci_dev->dev, wol->wolopts);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   795
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   796
	spin_unlock_irq(&tp->lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   797
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   798
	return 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   799
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   800
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   801
static void rtl8169_get_drvinfo(struct net_device *dev,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   802
				struct ethtool_drvinfo *info)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   803
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   804
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   805
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   806
	strcpy(info->driver, MODULENAME);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   807
	strcpy(info->version, RTL8169_VERSION);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   808
	strcpy(info->bus_info, pci_name(tp->pci_dev));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   809
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   810
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   811
static int rtl8169_get_regs_len(struct net_device *dev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   812
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   813
	return R8169_REGS_SIZE;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   814
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   815
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   816
static int rtl8169_set_speed_tbi(struct net_device *dev,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   817
				 u8 autoneg, u16 speed, u8 duplex)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   818
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   819
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   820
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   821
	int ret = 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   822
	u32 reg;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   823
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   824
	reg = RTL_R32(TBICSR);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   825
	if ((autoneg == AUTONEG_DISABLE) && (speed == SPEED_1000) &&
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   826
	    (duplex == DUPLEX_FULL)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   827
		RTL_W32(TBICSR, reg & ~(TBINwEnable | TBINwRestart));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   828
	} else if (autoneg == AUTONEG_ENABLE)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   829
		RTL_W32(TBICSR, reg | TBINwEnable | TBINwRestart);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   830
	else {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   831
		if (netif_msg_link(tp)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   832
			printk(KERN_WARNING "%s: "
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   833
			       "incorrect speed setting refused in TBI mode\n",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   834
			       dev->name);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   835
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   836
		ret = -EOPNOTSUPP;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   837
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   838
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   839
	return ret;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   840
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   841
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   842
static int rtl8169_set_speed_xmii(struct net_device *dev,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   843
				  u8 autoneg, u16 speed, u8 duplex)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   844
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   845
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   846
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   847
	int auto_nego, giga_ctrl;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   848
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   849
	auto_nego = mdio_read(ioaddr, MII_ADVERTISE);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   850
	auto_nego &= ~(ADVERTISE_10HALF | ADVERTISE_10FULL |
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   851
		       ADVERTISE_100HALF | ADVERTISE_100FULL);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   852
	giga_ctrl = mdio_read(ioaddr, MII_CTRL1000);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   853
	giga_ctrl &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   854
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   855
	if (autoneg == AUTONEG_ENABLE) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   856
		auto_nego |= (ADVERTISE_10HALF | ADVERTISE_10FULL |
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   857
			      ADVERTISE_100HALF | ADVERTISE_100FULL);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   858
		giga_ctrl |= ADVERTISE_1000FULL | ADVERTISE_1000HALF;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   859
	} else {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   860
		if (speed == SPEED_10)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   861
			auto_nego |= ADVERTISE_10HALF | ADVERTISE_10FULL;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   862
		else if (speed == SPEED_100)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   863
			auto_nego |= ADVERTISE_100HALF | ADVERTISE_100FULL;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   864
		else if (speed == SPEED_1000)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   865
			giga_ctrl |= ADVERTISE_1000FULL | ADVERTISE_1000HALF;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   866
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   867
		if (duplex == DUPLEX_HALF)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   868
			auto_nego &= ~(ADVERTISE_10FULL | ADVERTISE_100FULL);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   869
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   870
		if (duplex == DUPLEX_FULL)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   871
			auto_nego &= ~(ADVERTISE_10HALF | ADVERTISE_100HALF);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   872
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   873
		/* This tweak comes straight from Realtek's driver. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   874
		if ((speed == SPEED_100) && (duplex == DUPLEX_HALF) &&
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   875
		    ((tp->mac_version == RTL_GIGA_MAC_VER_13) ||
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   876
		     (tp->mac_version == RTL_GIGA_MAC_VER_16))) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   877
			auto_nego = ADVERTISE_100HALF | ADVERTISE_CSMA;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   878
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   879
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   880
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   881
	/* The 8100e/8101e/8102e do Fast Ethernet only. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   882
	if ((tp->mac_version == RTL_GIGA_MAC_VER_07) ||
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   883
	    (tp->mac_version == RTL_GIGA_MAC_VER_08) ||
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   884
	    (tp->mac_version == RTL_GIGA_MAC_VER_09) ||
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   885
	    (tp->mac_version == RTL_GIGA_MAC_VER_10) ||
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   886
	    (tp->mac_version == RTL_GIGA_MAC_VER_13) ||
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   887
	    (tp->mac_version == RTL_GIGA_MAC_VER_14) ||
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   888
	    (tp->mac_version == RTL_GIGA_MAC_VER_15) ||
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   889
	    (tp->mac_version == RTL_GIGA_MAC_VER_16)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   890
		if ((giga_ctrl & (ADVERTISE_1000FULL | ADVERTISE_1000HALF)) &&
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   891
		    netif_msg_link(tp)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   892
			printk(KERN_INFO "%s: PHY does not support 1000Mbps.\n",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   893
			       dev->name);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   894
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   895
		giga_ctrl &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   896
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   897
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   898
	auto_nego |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   899
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   900
	if ((tp->mac_version == RTL_GIGA_MAC_VER_11) ||
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   901
	    (tp->mac_version == RTL_GIGA_MAC_VER_12) ||
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   902
	    (tp->mac_version >= RTL_GIGA_MAC_VER_17)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   903
		/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   904
		 * Wake up the PHY.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   905
		 * Vendor specific (0x1f) and reserved (0x0e) MII registers.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   906
		 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   907
		mdio_write(ioaddr, 0x1f, 0x0000);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   908
		mdio_write(ioaddr, 0x0e, 0x0000);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   909
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   910
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   911
	tp->phy_auto_nego_reg = auto_nego;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   912
	tp->phy_1000_ctrl_reg = giga_ctrl;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   913
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   914
	mdio_write(ioaddr, MII_ADVERTISE, auto_nego);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   915
	mdio_write(ioaddr, MII_CTRL1000, giga_ctrl);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   916
	mdio_write(ioaddr, MII_BMCR, BMCR_ANENABLE | BMCR_ANRESTART);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   917
	return 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   918
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   919
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   920
static int rtl8169_set_speed(struct net_device *dev,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   921
			     u8 autoneg, u16 speed, u8 duplex)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   922
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   923
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   924
	int ret;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   925
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   926
	ret = tp->set_speed(dev, autoneg, speed, duplex);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   927
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   928
	if (netif_running(dev) && (tp->phy_1000_ctrl_reg & ADVERTISE_1000FULL))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   929
		mod_timer(&tp->timer, jiffies + RTL8169_PHY_TIMEOUT);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   930
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   931
	return ret;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   932
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   933
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   934
static int rtl8169_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   935
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   936
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   937
	unsigned long flags;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   938
	int ret;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   939
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   940
	spin_lock_irqsave(&tp->lock, flags);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   941
	ret = rtl8169_set_speed(dev, cmd->autoneg, cmd->speed, cmd->duplex);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   942
	spin_unlock_irqrestore(&tp->lock, flags);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   943
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   944
	return ret;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   945
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   946
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   947
static u32 rtl8169_get_rx_csum(struct net_device *dev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   948
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   949
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   950
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   951
	return tp->cp_cmd & RxChkSum;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   952
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   953
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   954
static int rtl8169_set_rx_csum(struct net_device *dev, u32 data)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   955
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   956
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   957
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   958
	unsigned long flags;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   959
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   960
	spin_lock_irqsave(&tp->lock, flags);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   961
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   962
	if (data)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   963
		tp->cp_cmd |= RxChkSum;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   964
	else
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   965
		tp->cp_cmd &= ~RxChkSum;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   966
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   967
	RTL_W16(CPlusCmd, tp->cp_cmd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   968
	RTL_R16(CPlusCmd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   969
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   970
	spin_unlock_irqrestore(&tp->lock, flags);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   971
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   972
	return 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   973
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   974
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   975
#ifdef CONFIG_R8169_VLAN
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   976
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   977
static inline u32 rtl8169_tx_vlan_tag(struct rtl8169_private *tp,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   978
				      struct sk_buff *skb)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   979
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   980
	return (tp->vlgrp && vlan_tx_tag_present(skb)) ?
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   981
		TxVlanTag | swab16(vlan_tx_tag_get(skb)) : 0x00;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   982
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   983
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   984
static void rtl8169_vlan_rx_register(struct net_device *dev,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   985
				     struct vlan_group *grp)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   986
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   987
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   988
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   989
	unsigned long flags;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   990
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   991
	spin_lock_irqsave(&tp->lock, flags);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   992
	tp->vlgrp = grp;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   993
	if (tp->vlgrp)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   994
		tp->cp_cmd |= RxVlan;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   995
	else
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   996
		tp->cp_cmd &= ~RxVlan;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   997
	RTL_W16(CPlusCmd, tp->cp_cmd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   998
	RTL_R16(CPlusCmd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   999
	spin_unlock_irqrestore(&tp->lock, flags);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1000
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1001
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1002
static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1003
			       struct sk_buff *skb)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1004
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1005
	u32 opts2 = le32_to_cpu(desc->opts2);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1006
	struct vlan_group *vlgrp = tp->vlgrp;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1007
	int ret;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1008
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1009
	if (vlgrp && (opts2 & RxVlanTag)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1010
		vlan_hwaccel_receive_skb(skb, vlgrp, swab16(opts2 & 0xffff));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1011
		ret = 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1012
	} else
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1013
		ret = -1;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1014
	desc->opts2 = 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1015
	return ret;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1016
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1017
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1018
#else /* !CONFIG_R8169_VLAN */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1019
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1020
static inline u32 rtl8169_tx_vlan_tag(struct rtl8169_private *tp,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1021
				      struct sk_buff *skb)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1022
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1023
	return 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1024
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1025
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1026
static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1027
			       struct sk_buff *skb)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1028
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1029
	return -1;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1030
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1031
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1032
#endif
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1033
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1034
static int rtl8169_gset_tbi(struct net_device *dev, struct ethtool_cmd *cmd)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1035
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1036
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1037
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1038
	u32 status;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1039
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1040
	cmd->supported =
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1041
		SUPPORTED_1000baseT_Full | SUPPORTED_Autoneg | SUPPORTED_FIBRE;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1042
	cmd->port = PORT_FIBRE;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1043
	cmd->transceiver = XCVR_INTERNAL;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1044
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1045
	status = RTL_R32(TBICSR);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1046
	cmd->advertising = (status & TBINwEnable) ?  ADVERTISED_Autoneg : 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1047
	cmd->autoneg = !!(status & TBINwEnable);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1048
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1049
	cmd->speed = SPEED_1000;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1050
	cmd->duplex = DUPLEX_FULL; /* Always set */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1051
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1052
	return 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1053
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1054
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1055
static int rtl8169_gset_xmii(struct net_device *dev, struct ethtool_cmd *cmd)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1056
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1057
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1058
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1059
	return mii_ethtool_gset(&tp->mii, cmd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1060
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1061
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1062
static int rtl8169_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1063
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1064
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1065
	unsigned long flags;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1066
	int rc;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1067
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1068
	spin_lock_irqsave(&tp->lock, flags);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1069
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1070
	rc = tp->get_settings(dev, cmd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1071
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1072
	spin_unlock_irqrestore(&tp->lock, flags);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1073
	return rc;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1074
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1075
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1076
static void rtl8169_get_regs(struct net_device *dev, struct ethtool_regs *regs,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1077
			     void *p)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1078
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1079
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1080
	unsigned long flags;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1081
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1082
	if (regs->len > R8169_REGS_SIZE)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1083
		regs->len = R8169_REGS_SIZE;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1084
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1085
	spin_lock_irqsave(&tp->lock, flags);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1086
	memcpy_fromio(p, tp->mmio_addr, regs->len);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1087
	spin_unlock_irqrestore(&tp->lock, flags);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1088
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1089
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1090
static u32 rtl8169_get_msglevel(struct net_device *dev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1091
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1092
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1093
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1094
	return tp->msg_enable;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1095
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1096
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1097
static void rtl8169_set_msglevel(struct net_device *dev, u32 value)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1098
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1099
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1100
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1101
	tp->msg_enable = value;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1102
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1103
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1104
static const char rtl8169_gstrings[][ETH_GSTRING_LEN] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1105
	"tx_packets",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1106
	"rx_packets",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1107
	"tx_errors",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1108
	"rx_errors",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1109
	"rx_missed",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1110
	"align_errors",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1111
	"tx_single_collisions",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1112
	"tx_multi_collisions",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1113
	"unicast",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1114
	"broadcast",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1115
	"multicast",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1116
	"tx_aborted",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1117
	"tx_underrun",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1118
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1119
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1120
static int rtl8169_get_sset_count(struct net_device *dev, int sset)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1121
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1122
	switch (sset) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1123
	case ETH_SS_STATS:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1124
		return ARRAY_SIZE(rtl8169_gstrings);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1125
	default:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1126
		return -EOPNOTSUPP;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1127
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1128
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1129
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1130
static void rtl8169_update_counters(struct net_device *dev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1131
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1132
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1133
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1134
	struct rtl8169_counters *counters;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1135
	dma_addr_t paddr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1136
	u32 cmd;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1137
	int wait = 1000;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1138
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1139
	/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1140
	 * Some chips are unable to dump tally counters when the receiver
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1141
	 * is disabled.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1142
	 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1143
	if ((RTL_R8(ChipCmd) & CmdRxEnb) == 0)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1144
		return;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1145
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1146
	counters = pci_alloc_consistent(tp->pci_dev, sizeof(*counters), &paddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1147
	if (!counters)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1148
		return;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1149
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1150
	RTL_W32(CounterAddrHigh, (u64)paddr >> 32);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1151
	cmd = (u64)paddr & DMA_32BIT_MASK;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1152
	RTL_W32(CounterAddrLow, cmd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1153
	RTL_W32(CounterAddrLow, cmd | CounterDump);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1154
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1155
	while (wait--) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1156
		if ((RTL_R32(CounterAddrLow) & CounterDump) == 0) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1157
			/* copy updated counters */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1158
			memcpy(&tp->counters, counters, sizeof(*counters));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1159
			break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1160
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1161
		udelay(10);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1162
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1163
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1164
	RTL_W32(CounterAddrLow, 0);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1165
	RTL_W32(CounterAddrHigh, 0);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1166
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1167
	pci_free_consistent(tp->pci_dev, sizeof(*counters), counters, paddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1168
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1169
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1170
static void rtl8169_get_ethtool_stats(struct net_device *dev,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1171
				      struct ethtool_stats *stats, u64 *data)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1172
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1173
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1174
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1175
	ASSERT_RTNL();
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1176
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1177
	rtl8169_update_counters(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1178
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1179
	data[0] = le64_to_cpu(tp->counters.tx_packets);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1180
	data[1] = le64_to_cpu(tp->counters.rx_packets);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1181
	data[2] = le64_to_cpu(tp->counters.tx_errors);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1182
	data[3] = le32_to_cpu(tp->counters.rx_errors);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1183
	data[4] = le16_to_cpu(tp->counters.rx_missed);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1184
	data[5] = le16_to_cpu(tp->counters.align_errors);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1185
	data[6] = le32_to_cpu(tp->counters.tx_one_collision);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1186
	data[7] = le32_to_cpu(tp->counters.tx_multi_collision);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1187
	data[8] = le64_to_cpu(tp->counters.rx_unicast);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1188
	data[9] = le64_to_cpu(tp->counters.rx_broadcast);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1189
	data[10] = le32_to_cpu(tp->counters.rx_multicast);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1190
	data[11] = le16_to_cpu(tp->counters.tx_aborted);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1191
	data[12] = le16_to_cpu(tp->counters.tx_underun);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1192
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1193
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1194
static void rtl8169_get_strings(struct net_device *dev, u32 stringset, u8 *data)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1195
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1196
	switch(stringset) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1197
	case ETH_SS_STATS:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1198
		memcpy(data, *rtl8169_gstrings, sizeof(rtl8169_gstrings));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1199
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1200
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1201
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1202
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1203
static const struct ethtool_ops rtl8169_ethtool_ops = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1204
	.get_drvinfo		= rtl8169_get_drvinfo,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1205
	.get_regs_len		= rtl8169_get_regs_len,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1206
	.get_link		= ethtool_op_get_link,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1207
	.get_settings		= rtl8169_get_settings,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1208
	.set_settings		= rtl8169_set_settings,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1209
	.get_msglevel		= rtl8169_get_msglevel,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1210
	.set_msglevel		= rtl8169_set_msglevel,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1211
	.get_rx_csum		= rtl8169_get_rx_csum,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1212
	.set_rx_csum		= rtl8169_set_rx_csum,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1213
	.set_tx_csum		= ethtool_op_set_tx_csum,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1214
	.set_sg			= ethtool_op_set_sg,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1215
	.set_tso		= ethtool_op_set_tso,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1216
	.get_regs		= rtl8169_get_regs,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1217
	.get_wol		= rtl8169_get_wol,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1218
	.set_wol		= rtl8169_set_wol,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1219
	.get_strings		= rtl8169_get_strings,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1220
	.get_sset_count		= rtl8169_get_sset_count,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1221
	.get_ethtool_stats	= rtl8169_get_ethtool_stats,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1222
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1223
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1224
static void rtl8169_write_gmii_reg_bit(void __iomem *ioaddr, int reg,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1225
				       int bitnum, int bitval)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1226
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1227
	int val;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1228
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1229
	val = mdio_read(ioaddr, reg);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1230
	val = (bitval == 1) ?
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1231
		val | (bitval << bitnum) :  val & ~(0x0001 << bitnum);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1232
	mdio_write(ioaddr, reg, val & 0xffff);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1233
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1234
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1235
static void rtl8169_get_mac_version(struct rtl8169_private *tp,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1236
				    void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1237
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1238
	/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1239
	 * The driver currently handles the 8168Bf and the 8168Be identically
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1240
	 * but they can be identified more specifically through the test below
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1241
	 * if needed:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1242
	 *
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1243
	 * (RTL_R32(TxConfig) & 0x700000) == 0x500000 ? 8168Bf : 8168Be
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1244
	 *
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1245
	 * Same thing for the 8101Eb and the 8101Ec:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1246
	 *
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1247
	 * (RTL_R32(TxConfig) & 0x700000) == 0x200000 ? 8101Eb : 8101Ec
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1248
	 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1249
	const struct {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1250
		u32 mask;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1251
		u32 val;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1252
		int mac_version;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1253
	} mac_info[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1254
		/* 8168D family. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1255
		{ 0x7c800000, 0x28000000,	RTL_GIGA_MAC_VER_25 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1256
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1257
		/* 8168C family. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1258
		{ 0x7cf00000, 0x3ca00000,	RTL_GIGA_MAC_VER_24 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1259
		{ 0x7cf00000, 0x3c900000,	RTL_GIGA_MAC_VER_23 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1260
		{ 0x7cf00000, 0x3c800000,	RTL_GIGA_MAC_VER_18 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1261
		{ 0x7c800000, 0x3c800000,	RTL_GIGA_MAC_VER_24 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1262
		{ 0x7cf00000, 0x3c000000,	RTL_GIGA_MAC_VER_19 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1263
		{ 0x7cf00000, 0x3c200000,	RTL_GIGA_MAC_VER_20 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1264
		{ 0x7cf00000, 0x3c300000,	RTL_GIGA_MAC_VER_21 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1265
		{ 0x7cf00000, 0x3c400000,	RTL_GIGA_MAC_VER_22 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1266
		{ 0x7c800000, 0x3c000000,	RTL_GIGA_MAC_VER_22 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1267
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1268
		/* 8168B family. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1269
		{ 0x7cf00000, 0x38000000,	RTL_GIGA_MAC_VER_12 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1270
		{ 0x7cf00000, 0x38500000,	RTL_GIGA_MAC_VER_17 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1271
		{ 0x7c800000, 0x38000000,	RTL_GIGA_MAC_VER_17 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1272
		{ 0x7c800000, 0x30000000,	RTL_GIGA_MAC_VER_11 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1273
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1274
		/* 8101 family. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1275
		{ 0x7cf00000, 0x34a00000,	RTL_GIGA_MAC_VER_09 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1276
		{ 0x7cf00000, 0x24a00000,	RTL_GIGA_MAC_VER_09 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1277
		{ 0x7cf00000, 0x34900000,	RTL_GIGA_MAC_VER_08 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1278
		{ 0x7cf00000, 0x24900000,	RTL_GIGA_MAC_VER_08 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1279
		{ 0x7cf00000, 0x34800000,	RTL_GIGA_MAC_VER_07 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1280
		{ 0x7cf00000, 0x24800000,	RTL_GIGA_MAC_VER_07 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1281
		{ 0x7cf00000, 0x34000000,	RTL_GIGA_MAC_VER_13 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1282
		{ 0x7cf00000, 0x34300000,	RTL_GIGA_MAC_VER_10 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1283
		{ 0x7cf00000, 0x34200000,	RTL_GIGA_MAC_VER_16 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1284
		{ 0x7c800000, 0x34800000,	RTL_GIGA_MAC_VER_09 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1285
		{ 0x7c800000, 0x24800000,	RTL_GIGA_MAC_VER_09 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1286
		{ 0x7c800000, 0x34000000,	RTL_GIGA_MAC_VER_16 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1287
		/* FIXME: where did these entries come from ? -- FR */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1288
		{ 0xfc800000, 0x38800000,	RTL_GIGA_MAC_VER_15 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1289
		{ 0xfc800000, 0x30800000,	RTL_GIGA_MAC_VER_14 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1290
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1291
		/* 8110 family. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1292
		{ 0xfc800000, 0x98000000,	RTL_GIGA_MAC_VER_06 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1293
		{ 0xfc800000, 0x18000000,	RTL_GIGA_MAC_VER_05 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1294
		{ 0xfc800000, 0x10000000,	RTL_GIGA_MAC_VER_04 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1295
		{ 0xfc800000, 0x04000000,	RTL_GIGA_MAC_VER_03 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1296
		{ 0xfc800000, 0x00800000,	RTL_GIGA_MAC_VER_02 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1297
		{ 0xfc800000, 0x00000000,	RTL_GIGA_MAC_VER_01 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1298
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1299
		{ 0x00000000, 0x00000000,	RTL_GIGA_MAC_VER_01 }	/* Catch-all */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1300
	}, *p = mac_info;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1301
	u32 reg;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1302
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1303
	reg = RTL_R32(TxConfig);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1304
	while ((reg & p->mask) != p->val)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1305
		p++;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1306
	tp->mac_version = p->mac_version;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1307
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1308
	if (p->mask == 0x00000000) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1309
		struct pci_dev *pdev = tp->pci_dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1310
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1311
		dev_info(&pdev->dev, "unknown MAC (%08x)\n", reg);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1312
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1313
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1314
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1315
static void rtl8169_print_mac_version(struct rtl8169_private *tp)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1316
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1317
	dprintk("mac_version = 0x%02x\n", tp->mac_version);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1318
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1319
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1320
struct phy_reg {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1321
	u16 reg;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1322
	u16 val;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1323
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1324
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1325
static void rtl_phy_write(void __iomem *ioaddr, struct phy_reg *regs, int len)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1326
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1327
	while (len-- > 0) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1328
		mdio_write(ioaddr, regs->reg, regs->val);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1329
		regs++;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1330
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1331
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1332
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1333
static void rtl8169s_hw_phy_config(void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1334
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1335
	struct {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1336
		u16 regs[5]; /* Beware of bit-sign propagation */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1337
	} phy_magic[5] = { {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1338
		{ 0x0000,	//w 4 15 12 0
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1339
		  0x00a1,	//w 3 15 0 00a1
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1340
		  0x0008,	//w 2 15 0 0008
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1341
		  0x1020,	//w 1 15 0 1020
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1342
		  0x1000 } },{	//w 0 15 0 1000
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1343
		{ 0x7000,	//w 4 15 12 7
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1344
		  0xff41,	//w 3 15 0 ff41
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1345
		  0xde60,	//w 2 15 0 de60
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1346
		  0x0140,	//w 1 15 0 0140
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1347
		  0x0077 } },{	//w 0 15 0 0077
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1348
		{ 0xa000,	//w 4 15 12 a
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1349
		  0xdf01,	//w 3 15 0 df01
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1350
		  0xdf20,	//w 2 15 0 df20
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1351
		  0xff95,	//w 1 15 0 ff95
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1352
		  0xfa00 } },{	//w 0 15 0 fa00
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1353
		{ 0xb000,	//w 4 15 12 b
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1354
		  0xff41,	//w 3 15 0 ff41
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1355
		  0xde20,	//w 2 15 0 de20
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1356
		  0x0140,	//w 1 15 0 0140
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1357
		  0x00bb } },{	//w 0 15 0 00bb
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1358
		{ 0xf000,	//w 4 15 12 f
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1359
		  0xdf01,	//w 3 15 0 df01
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1360
		  0xdf20,	//w 2 15 0 df20
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1361
		  0xff95,	//w 1 15 0 ff95
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1362
		  0xbf00 }	//w 0 15 0 bf00
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1363
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1364
	}, *p = phy_magic;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1365
	unsigned int i;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1366
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1367
	mdio_write(ioaddr, 0x1f, 0x0001);		//w 31 2 0 1
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1368
	mdio_write(ioaddr, 0x15, 0x1000);		//w 21 15 0 1000
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1369
	mdio_write(ioaddr, 0x18, 0x65c7);		//w 24 15 0 65c7
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1370
	rtl8169_write_gmii_reg_bit(ioaddr, 4, 11, 0);	//w 4 11 11 0
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1371
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1372
	for (i = 0; i < ARRAY_SIZE(phy_magic); i++, p++) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1373
		int val, pos = 4;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1374
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1375
		val = (mdio_read(ioaddr, pos) & 0x0fff) | (p->regs[0] & 0xffff);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1376
		mdio_write(ioaddr, pos, val);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1377
		while (--pos >= 0)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1378
			mdio_write(ioaddr, pos, p->regs[4 - pos] & 0xffff);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1379
		rtl8169_write_gmii_reg_bit(ioaddr, 4, 11, 1); //w 4 11 11 1
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1380
		rtl8169_write_gmii_reg_bit(ioaddr, 4, 11, 0); //w 4 11 11 0
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1381
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1382
	mdio_write(ioaddr, 0x1f, 0x0000); //w 31 2 0 0
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1383
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1384
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1385
static void rtl8169sb_hw_phy_config(void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1386
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1387
	struct phy_reg phy_reg_init[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1388
		{ 0x1f, 0x0002 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1389
		{ 0x01, 0x90d0 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1390
		{ 0x1f, 0x0000 }
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1391
	};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1392
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1393
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1394
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1395
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1396
static void rtl8168bb_hw_phy_config(void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1397
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1398
	struct phy_reg phy_reg_init[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1399
		{ 0x10, 0xf41b },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1400
		{ 0x1f, 0x0000 }
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1401
	};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1402
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1403
	mdio_write(ioaddr, 0x1f, 0x0001);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1404
	mdio_patch(ioaddr, 0x16, 1 << 0);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1405
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1406
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1407
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1408
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1409
static void rtl8168bef_hw_phy_config(void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1410
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1411
	struct phy_reg phy_reg_init[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1412
		{ 0x1f, 0x0001 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1413
		{ 0x10, 0xf41b },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1414
		{ 0x1f, 0x0000 }
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1415
	};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1416
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1417
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1418
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1419
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1420
static void rtl8168cp_1_hw_phy_config(void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1421
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1422
	struct phy_reg phy_reg_init[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1423
		{ 0x1f, 0x0000 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1424
		{ 0x1d, 0x0f00 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1425
		{ 0x1f, 0x0002 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1426
		{ 0x0c, 0x1ec8 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1427
		{ 0x1f, 0x0000 }
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1428
	};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1429
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1430
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1431
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1432
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1433
static void rtl8168cp_2_hw_phy_config(void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1434
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1435
	struct phy_reg phy_reg_init[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1436
		{ 0x1f, 0x0001 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1437
		{ 0x1d, 0x3d98 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1438
		{ 0x1f, 0x0000 }
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1439
	};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1440
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1441
	mdio_write(ioaddr, 0x1f, 0x0000);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1442
	mdio_patch(ioaddr, 0x14, 1 << 5);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1443
	mdio_patch(ioaddr, 0x0d, 1 << 5);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1444
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1445
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1446
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1447
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1448
static void rtl8168c_1_hw_phy_config(void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1449
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1450
	struct phy_reg phy_reg_init[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1451
		{ 0x1f, 0x0001 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1452
		{ 0x12, 0x2300 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1453
		{ 0x1f, 0x0002 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1454
		{ 0x00, 0x88d4 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1455
		{ 0x01, 0x82b1 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1456
		{ 0x03, 0x7002 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1457
		{ 0x08, 0x9e30 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1458
		{ 0x09, 0x01f0 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1459
		{ 0x0a, 0x5500 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1460
		{ 0x0c, 0x00c8 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1461
		{ 0x1f, 0x0003 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1462
		{ 0x12, 0xc096 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1463
		{ 0x16, 0x000a },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1464
		{ 0x1f, 0x0000 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1465
		{ 0x1f, 0x0000 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1466
		{ 0x09, 0x2000 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1467
		{ 0x09, 0x0000 }
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1468
	};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1469
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1470
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1471
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1472
	mdio_patch(ioaddr, 0x14, 1 << 5);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1473
	mdio_patch(ioaddr, 0x0d, 1 << 5);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1474
	mdio_write(ioaddr, 0x1f, 0x0000);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1475
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1476
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1477
static void rtl8168c_2_hw_phy_config(void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1478
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1479
	struct phy_reg phy_reg_init[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1480
		{ 0x1f, 0x0001 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1481
		{ 0x12, 0x2300 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1482
		{ 0x03, 0x802f },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1483
		{ 0x02, 0x4f02 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1484
		{ 0x01, 0x0409 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1485
		{ 0x00, 0xf099 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1486
		{ 0x04, 0x9800 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1487
		{ 0x04, 0x9000 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1488
		{ 0x1d, 0x3d98 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1489
		{ 0x1f, 0x0002 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1490
		{ 0x0c, 0x7eb8 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1491
		{ 0x06, 0x0761 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1492
		{ 0x1f, 0x0003 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1493
		{ 0x16, 0x0f0a },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1494
		{ 0x1f, 0x0000 }
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1495
	};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1496
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1497
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1498
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1499
	mdio_patch(ioaddr, 0x16, 1 << 0);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1500
	mdio_patch(ioaddr, 0x14, 1 << 5);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1501
	mdio_patch(ioaddr, 0x0d, 1 << 5);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1502
	mdio_write(ioaddr, 0x1f, 0x0000);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1503
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1504
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1505
static void rtl8168c_3_hw_phy_config(void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1506
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1507
	struct phy_reg phy_reg_init[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1508
		{ 0x1f, 0x0001 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1509
		{ 0x12, 0x2300 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1510
		{ 0x1d, 0x3d98 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1511
		{ 0x1f, 0x0002 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1512
		{ 0x0c, 0x7eb8 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1513
		{ 0x06, 0x5461 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1514
		{ 0x1f, 0x0003 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1515
		{ 0x16, 0x0f0a },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1516
		{ 0x1f, 0x0000 }
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1517
	};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1518
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1519
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1520
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1521
	mdio_patch(ioaddr, 0x16, 1 << 0);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1522
	mdio_patch(ioaddr, 0x14, 1 << 5);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1523
	mdio_patch(ioaddr, 0x0d, 1 << 5);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1524
	mdio_write(ioaddr, 0x1f, 0x0000);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1525
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1526
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1527
static void rtl8168c_4_hw_phy_config(void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1528
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1529
	rtl8168c_3_hw_phy_config(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1530
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1531
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1532
static void rtl8168d_hw_phy_config(void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1533
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1534
	struct phy_reg phy_reg_init_0[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1535
		{ 0x1f, 0x0001 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1536
		{ 0x09, 0x2770 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1537
		{ 0x08, 0x04d0 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1538
		{ 0x0b, 0xad15 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1539
		{ 0x0c, 0x5bf0 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1540
		{ 0x1c, 0xf101 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1541
		{ 0x1f, 0x0003 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1542
		{ 0x14, 0x94d7 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1543
		{ 0x12, 0xf4d6 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1544
		{ 0x09, 0xca0f },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1545
		{ 0x1f, 0x0002 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1546
		{ 0x0b, 0x0b10 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1547
		{ 0x0c, 0xd1f7 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1548
		{ 0x1f, 0x0002 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1549
		{ 0x06, 0x5461 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1550
		{ 0x1f, 0x0002 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1551
		{ 0x05, 0x6662 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1552
		{ 0x1f, 0x0000 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1553
		{ 0x14, 0x0060 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1554
		{ 0x1f, 0x0000 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1555
		{ 0x0d, 0xf8a0 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1556
		{ 0x1f, 0x0005 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1557
		{ 0x05, 0xffc2 }
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1558
	};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1559
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1560
	rtl_phy_write(ioaddr, phy_reg_init_0, ARRAY_SIZE(phy_reg_init_0));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1561
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1562
	if (mdio_read(ioaddr, 0x06) == 0xc400) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1563
		struct phy_reg phy_reg_init_1[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1564
			{ 0x1f, 0x0005 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1565
			{ 0x01, 0x0300 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1566
			{ 0x1f, 0x0000 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1567
			{ 0x11, 0x401c },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1568
			{ 0x16, 0x4100 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1569
			{ 0x1f, 0x0005 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1570
			{ 0x07, 0x0010 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1571
			{ 0x05, 0x83dc },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1572
			{ 0x06, 0x087d },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1573
			{ 0x05, 0x8300 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1574
			{ 0x06, 0x0101 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1575
			{ 0x06, 0x05f8 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1576
			{ 0x06, 0xf9fa },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1577
			{ 0x06, 0xfbef },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1578
			{ 0x06, 0x79e2 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1579
			{ 0x06, 0x835f },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1580
			{ 0x06, 0xe0f8 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1581
			{ 0x06, 0x9ae1 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1582
			{ 0x06, 0xf89b },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1583
			{ 0x06, 0xef31 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1584
			{ 0x06, 0x3b65 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1585
			{ 0x06, 0xaa07 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1586
			{ 0x06, 0x81e4 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1587
			{ 0x06, 0xf89a },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1588
			{ 0x06, 0xe5f8 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1589
			{ 0x06, 0x9baf },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1590
			{ 0x06, 0x06ae },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1591
			{ 0x05, 0x83dc },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1592
			{ 0x06, 0x8300 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1593
		};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1594
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1595
		rtl_phy_write(ioaddr, phy_reg_init_1,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1596
			      ARRAY_SIZE(phy_reg_init_1));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1597
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1598
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1599
	mdio_write(ioaddr, 0x1f, 0x0000);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1600
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1601
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1602
static void rtl8102e_hw_phy_config(void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1603
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1604
	struct phy_reg phy_reg_init[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1605
		{ 0x1f, 0x0003 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1606
		{ 0x08, 0x441d },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1607
		{ 0x01, 0x9100 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1608
		{ 0x1f, 0x0000 }
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1609
	};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1610
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1611
	mdio_write(ioaddr, 0x1f, 0x0000);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1612
	mdio_patch(ioaddr, 0x11, 1 << 12);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1613
	mdio_patch(ioaddr, 0x19, 1 << 13);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1614
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1615
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1616
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1617
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1618
static void rtl_hw_phy_config(struct net_device *dev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1619
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1620
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1621
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1622
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1623
	rtl8169_print_mac_version(tp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1624
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1625
	switch (tp->mac_version) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1626
	case RTL_GIGA_MAC_VER_01:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1627
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1628
	case RTL_GIGA_MAC_VER_02:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1629
	case RTL_GIGA_MAC_VER_03:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1630
		rtl8169s_hw_phy_config(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1631
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1632
	case RTL_GIGA_MAC_VER_04:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1633
		rtl8169sb_hw_phy_config(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1634
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1635
	case RTL_GIGA_MAC_VER_07:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1636
	case RTL_GIGA_MAC_VER_08:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1637
	case RTL_GIGA_MAC_VER_09:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1638
		rtl8102e_hw_phy_config(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1639
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1640
	case RTL_GIGA_MAC_VER_11:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1641
		rtl8168bb_hw_phy_config(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1642
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1643
	case RTL_GIGA_MAC_VER_12:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1644
		rtl8168bef_hw_phy_config(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1645
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1646
	case RTL_GIGA_MAC_VER_17:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1647
		rtl8168bef_hw_phy_config(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1648
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1649
	case RTL_GIGA_MAC_VER_18:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1650
		rtl8168cp_1_hw_phy_config(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1651
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1652
	case RTL_GIGA_MAC_VER_19:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1653
		rtl8168c_1_hw_phy_config(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1654
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1655
	case RTL_GIGA_MAC_VER_20:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1656
		rtl8168c_2_hw_phy_config(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1657
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1658
	case RTL_GIGA_MAC_VER_21:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1659
		rtl8168c_3_hw_phy_config(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1660
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1661
	case RTL_GIGA_MAC_VER_22:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1662
		rtl8168c_4_hw_phy_config(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1663
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1664
	case RTL_GIGA_MAC_VER_23:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1665
	case RTL_GIGA_MAC_VER_24:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1666
		rtl8168cp_2_hw_phy_config(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1667
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1668
	case RTL_GIGA_MAC_VER_25:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1669
		rtl8168d_hw_phy_config(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1670
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1671
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1672
	default:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1673
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1674
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1675
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1676
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1677
static void rtl8169_phy_timer(unsigned long __opaque)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1678
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1679
	struct net_device *dev = (struct net_device *)__opaque;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1680
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1681
	struct timer_list *timer = &tp->timer;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1682
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1683
	unsigned long timeout = RTL8169_PHY_TIMEOUT;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1684
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1685
	assert(tp->mac_version > RTL_GIGA_MAC_VER_01);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1686
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1687
	if (!(tp->phy_1000_ctrl_reg & ADVERTISE_1000FULL))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1688
		return;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1689
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1690
	spin_lock_irq(&tp->lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1691
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1692
	if (tp->phy_reset_pending(ioaddr)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1693
		/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1694
		 * A busy loop could burn quite a few cycles on nowadays CPU.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1695
		 * Let's delay the execution of the timer for a few ticks.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1696
		 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1697
		timeout = HZ/10;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1698
		goto out_mod_timer;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1699
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1700
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1701
	if (tp->link_ok(ioaddr))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1702
		goto out_unlock;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1703
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1704
	if (netif_msg_link(tp))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1705
		printk(KERN_WARNING "%s: PHY reset until link up\n", dev->name);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1706
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1707
	tp->phy_reset_enable(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1708
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1709
out_mod_timer:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1710
	mod_timer(timer, jiffies + timeout);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1711
out_unlock:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1712
	spin_unlock_irq(&tp->lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1713
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1714
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1715
static inline void rtl8169_delete_timer(struct net_device *dev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1716
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1717
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1718
	struct timer_list *timer = &tp->timer;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1719
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1720
	if (tp->mac_version <= RTL_GIGA_MAC_VER_01)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1721
		return;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1722
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1723
	del_timer_sync(timer);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1724
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1725
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1726
static inline void rtl8169_request_timer(struct net_device *dev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1727
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1728
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1729
	struct timer_list *timer = &tp->timer;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1730
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1731
	if (tp->mac_version <= RTL_GIGA_MAC_VER_01)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1732
		return;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1733
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1734
	mod_timer(timer, jiffies + RTL8169_PHY_TIMEOUT);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1735
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1736
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1737
#ifdef CONFIG_NET_POLL_CONTROLLER
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1738
/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1739
 * Polling 'interrupt' - used by things like netconsole to send skbs
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1740
 * without having to re-enable interrupts. It's not called while
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1741
 * the interrupt routine is executing.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1742
 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1743
static void rtl8169_netpoll(struct net_device *dev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1744
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1745
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1746
	struct pci_dev *pdev = tp->pci_dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1747
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1748
	disable_irq(pdev->irq);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1749
	rtl8169_interrupt(pdev->irq, dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1750
	enable_irq(pdev->irq);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1751
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1752
#endif
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1753
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1754
static void rtl8169_release_board(struct pci_dev *pdev, struct net_device *dev,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1755
				  void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1756
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1757
	iounmap(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1758
	pci_release_regions(pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1759
	pci_disable_device(pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1760
	free_netdev(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1761
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1762
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1763
static void rtl8169_phy_reset(struct net_device *dev,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1764
			      struct rtl8169_private *tp)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1765
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1766
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1767
	unsigned int i;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1768
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1769
	tp->phy_reset_enable(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1770
	for (i = 0; i < 100; i++) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1771
		if (!tp->phy_reset_pending(ioaddr))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1772
			return;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1773
		msleep(1);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1774
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1775
	if (netif_msg_link(tp))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1776
		printk(KERN_ERR "%s: PHY reset failed.\n", dev->name);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1777
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1778
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1779
static void rtl8169_init_phy(struct net_device *dev, struct rtl8169_private *tp)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1780
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1781
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1782
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1783
	rtl_hw_phy_config(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1784
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1785
	if (tp->mac_version <= RTL_GIGA_MAC_VER_06) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1786
		dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1787
		RTL_W8(0x82, 0x01);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1788
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1789
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1790
	pci_write_config_byte(tp->pci_dev, PCI_LATENCY_TIMER, 0x40);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1791
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1792
	if (tp->mac_version <= RTL_GIGA_MAC_VER_06)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1793
		pci_write_config_byte(tp->pci_dev, PCI_CACHE_LINE_SIZE, 0x08);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1794
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1795
	if (tp->mac_version == RTL_GIGA_MAC_VER_02) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1796
		dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1797
		RTL_W8(0x82, 0x01);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1798
		dprintk("Set PHY Reg 0x0bh = 0x00h\n");
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1799
		mdio_write(ioaddr, 0x0b, 0x0000); //w 0x0b 15 0 0
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1800
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1801
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1802
	rtl8169_phy_reset(dev, tp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1803
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1804
	/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1805
	 * rtl8169_set_speed_xmii takes good care of the Fast Ethernet
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1806
	 * only 8101. Don't panic.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1807
	 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1808
	rtl8169_set_speed(dev, AUTONEG_ENABLE, SPEED_1000, DUPLEX_FULL);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1809
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1810
	if ((RTL_R8(PHYstatus) & TBI_Enable) && netif_msg_link(tp))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1811
		printk(KERN_INFO PFX "%s: TBI auto-negotiating\n", dev->name);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1812
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1813
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1814
static void rtl_rar_set(struct rtl8169_private *tp, u8 *addr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1815
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1816
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1817
	u32 high;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1818
	u32 low;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1819
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1820
	low  = addr[0] | (addr[1] << 8) | (addr[2] << 16) | (addr[3] << 24);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1821
	high = addr[4] | (addr[5] << 8);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1822
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1823
	spin_lock_irq(&tp->lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1824
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1825
	RTL_W8(Cfg9346, Cfg9346_Unlock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1826
	RTL_W32(MAC0, low);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1827
	RTL_W32(MAC4, high);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1828
	RTL_W8(Cfg9346, Cfg9346_Lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1829
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1830
	spin_unlock_irq(&tp->lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1831
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1832
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1833
static int rtl_set_mac_address(struct net_device *dev, void *p)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1834
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1835
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1836
	struct sockaddr *addr = p;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1837
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1838
	if (!is_valid_ether_addr(addr->sa_data))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1839
		return -EADDRNOTAVAIL;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1840
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1841
	memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1842
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1843
	rtl_rar_set(tp, dev->dev_addr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1844
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1845
	return 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1846
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1847
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1848
static int rtl8169_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1849
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1850
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1851
	struct mii_ioctl_data *data = if_mii(ifr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1852
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1853
	return netif_running(dev) ? tp->do_ioctl(tp, data, cmd) : -ENODEV;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1854
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1855
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1856
static int rtl_xmii_ioctl(struct rtl8169_private *tp, struct mii_ioctl_data *data, int cmd)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1857
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1858
	switch (cmd) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1859
	case SIOCGMIIPHY:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1860
		data->phy_id = 32; /* Internal PHY */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1861
		return 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1862
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1863
	case SIOCGMIIREG:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1864
		data->val_out = mdio_read(tp->mmio_addr, data->reg_num & 0x1f);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1865
		return 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1866
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1867
	case SIOCSMIIREG:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1868
		if (!capable(CAP_NET_ADMIN))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1869
			return -EPERM;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1870
		mdio_write(tp->mmio_addr, data->reg_num & 0x1f, data->val_in);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1871
		return 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1872
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1873
	return -EOPNOTSUPP;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1874
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1875
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1876
static int rtl_tbi_ioctl(struct rtl8169_private *tp, struct mii_ioctl_data *data, int cmd)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1877
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1878
	return -EOPNOTSUPP;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1879
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1880
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1881
static const struct rtl_cfg_info {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1882
	void (*hw_start)(struct net_device *);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1883
	unsigned int region;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1884
	unsigned int align;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1885
	u16 intr_event;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1886
	u16 napi_event;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1887
	unsigned features;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1888
} rtl_cfg_infos [] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1889
	[RTL_CFG_0] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1890
		.hw_start	= rtl_hw_start_8169,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1891
		.region		= 1,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1892
		.align		= 0,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1893
		.intr_event	= SYSErr | LinkChg | RxOverflow |
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1894
				  RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1895
		.napi_event	= RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1896
		.features	= RTL_FEATURE_GMII
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1897
	},
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1898
	[RTL_CFG_1] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1899
		.hw_start	= rtl_hw_start_8168,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1900
		.region		= 2,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1901
		.align		= 8,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1902
		.intr_event	= SYSErr | LinkChg | RxOverflow |
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1903
				  TxErr | TxOK | RxOK | RxErr,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1904
		.napi_event	= TxErr | TxOK | RxOK | RxOverflow,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1905
		.features	= RTL_FEATURE_GMII | RTL_FEATURE_MSI
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1906
	},
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1907
	[RTL_CFG_2] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1908
		.hw_start	= rtl_hw_start_8101,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1909
		.region		= 2,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1910
		.align		= 8,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1911
		.intr_event	= SYSErr | LinkChg | RxOverflow | PCSTimeout |
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1912
				  RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1913
		.napi_event	= RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1914
		.features	= RTL_FEATURE_MSI
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1915
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1916
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1917
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1918
/* Cfg9346_Unlock assumed. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1919
static unsigned rtl_try_msi(struct pci_dev *pdev, void __iomem *ioaddr,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1920
			    const struct rtl_cfg_info *cfg)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1921
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1922
	unsigned msi = 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1923
	u8 cfg2;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1924
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1925
	cfg2 = RTL_R8(Config2) & ~MSIEnable;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1926
	if (cfg->features & RTL_FEATURE_MSI) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1927
		if (pci_enable_msi(pdev)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1928
			dev_info(&pdev->dev, "no MSI. Back to INTx.\n");
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1929
		} else {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1930
			cfg2 |= MSIEnable;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1931
			msi = RTL_FEATURE_MSI;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1932
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1933
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1934
	RTL_W8(Config2, cfg2);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1935
	return msi;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1936
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1937
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1938
static void rtl_disable_msi(struct pci_dev *pdev, struct rtl8169_private *tp)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1939
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1940
	if (tp->features & RTL_FEATURE_MSI) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1941
		pci_disable_msi(pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1942
		tp->features &= ~RTL_FEATURE_MSI;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1943
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1944
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1945
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1946
static const struct net_device_ops rtl8169_netdev_ops = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1947
	.ndo_open		= rtl8169_open,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1948
	.ndo_stop		= rtl8169_close,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1949
	.ndo_get_stats		= rtl8169_get_stats,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1950
	.ndo_start_xmit		= rtl8169_start_xmit,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1951
	.ndo_tx_timeout		= rtl8169_tx_timeout,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1952
	.ndo_validate_addr	= eth_validate_addr,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1953
	.ndo_change_mtu		= rtl8169_change_mtu,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1954
	.ndo_set_mac_address	= rtl_set_mac_address,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1955
	.ndo_do_ioctl		= rtl8169_ioctl,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1956
	.ndo_set_multicast_list	= rtl_set_rx_mode,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1957
#ifdef CONFIG_R8169_VLAN
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1958
	.ndo_vlan_rx_register	= rtl8169_vlan_rx_register,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1959
#endif
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1960
#ifdef CONFIG_NET_POLL_CONTROLLER
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1961
	.ndo_poll_controller	= rtl8169_netpoll,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1962
#endif
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1963
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1964
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1965
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1966
static int __devinit
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1967
rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1968
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1969
	const struct rtl_cfg_info *cfg = rtl_cfg_infos + ent->driver_data;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1970
	const unsigned int region = cfg->region;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1971
	struct rtl8169_private *tp;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1972
	struct mii_if_info *mii;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1973
	struct net_device *dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1974
	void __iomem *ioaddr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1975
	unsigned int i;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1976
	int rc;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1977
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1978
	if (netif_msg_drv(&debug)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1979
		printk(KERN_INFO "%s Gigabit Ethernet driver %s loaded\n",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1980
		       MODULENAME, RTL8169_VERSION);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1981
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1982
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1983
	dev = alloc_etherdev(sizeof (*tp));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1984
	if (!dev) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1985
		if (netif_msg_drv(&debug))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1986
			dev_err(&pdev->dev, "unable to alloc new ethernet\n");
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1987
		rc = -ENOMEM;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1988
		goto out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1989
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1990
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1991
	SET_NETDEV_DEV(dev, &pdev->dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1992
	dev->netdev_ops = &rtl8169_netdev_ops;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1993
	tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1994
	tp->dev = dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1995
	tp->pci_dev = pdev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1996
	tp->msg_enable = netif_msg_init(debug.msg_enable, R8169_MSG_DEFAULT);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1997
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1998
	mii = &tp->mii;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1999
	mii->dev = dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2000
	mii->mdio_read = rtl_mdio_read;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2001
	mii->mdio_write = rtl_mdio_write;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2002
	mii->phy_id_mask = 0x1f;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2003
	mii->reg_num_mask = 0x1f;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2004
	mii->supports_gmii = !!(cfg->features & RTL_FEATURE_GMII);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2005
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2006
	/* enable device (incl. PCI PM wakeup and hotplug setup) */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2007
	rc = pci_enable_device(pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2008
	if (rc < 0) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2009
		if (netif_msg_probe(tp))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2010
			dev_err(&pdev->dev, "enable failure\n");
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2011
		goto err_out_free_dev_1;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2012
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2013
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2014
	rc = pci_set_mwi(pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2015
	if (rc < 0)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2016
		goto err_out_disable_2;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2017
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2018
	/* make sure PCI base addr 1 is MMIO */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2019
	if (!(pci_resource_flags(pdev, region) & IORESOURCE_MEM)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2020
		if (netif_msg_probe(tp)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2021
			dev_err(&pdev->dev,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2022
				"region #%d not an MMIO resource, aborting\n",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2023
				region);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2024
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2025
		rc = -ENODEV;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2026
		goto err_out_mwi_3;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2027
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2028
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2029
	/* check for weird/broken PCI region reporting */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2030
	if (pci_resource_len(pdev, region) < R8169_REGS_SIZE) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2031
		if (netif_msg_probe(tp)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2032
			dev_err(&pdev->dev,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2033
				"Invalid PCI region size(s), aborting\n");
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2034
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2035
		rc = -ENODEV;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2036
		goto err_out_mwi_3;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2037
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2038
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2039
	rc = pci_request_regions(pdev, MODULENAME);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2040
	if (rc < 0) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2041
		if (netif_msg_probe(tp))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2042
			dev_err(&pdev->dev, "could not request regions.\n");
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2043
		goto err_out_mwi_3;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2044
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2045
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2046
	tp->cp_cmd = PCIMulRW | RxChkSum;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2047
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2048
	if ((sizeof(dma_addr_t) > 4) &&
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2049
	    !pci_set_dma_mask(pdev, DMA_64BIT_MASK) && use_dac) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2050
		tp->cp_cmd |= PCIDAC;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2051
		dev->features |= NETIF_F_HIGHDMA;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2052
	} else {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2053
		rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2054
		if (rc < 0) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2055
			if (netif_msg_probe(tp)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2056
				dev_err(&pdev->dev,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2057
					"DMA configuration failed.\n");
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2058
			}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2059
			goto err_out_free_res_4;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2060
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2061
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2062
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2063
	pci_set_master(pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2064
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2065
	/* ioremap MMIO region */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2066
	ioaddr = ioremap(pci_resource_start(pdev, region), R8169_REGS_SIZE);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2067
	if (!ioaddr) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2068
		if (netif_msg_probe(tp))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2069
			dev_err(&pdev->dev, "cannot remap MMIO, aborting\n");
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2070
		rc = -EIO;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2071
		goto err_out_free_res_4;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2072
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2073
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2074
	tp->pcie_cap = pci_find_capability(pdev, PCI_CAP_ID_EXP);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2075
	if (!tp->pcie_cap && netif_msg_probe(tp))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2076
		dev_info(&pdev->dev, "no PCI Express capability\n");
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2077
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2078
	RTL_W16(IntrMask, 0x0000);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2079
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2080
	/* Soft reset the chip. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2081
	RTL_W8(ChipCmd, CmdReset);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2082
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2083
	/* Check that the chip has finished the reset. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2084
	for (i = 0; i < 100; i++) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2085
		if ((RTL_R8(ChipCmd) & CmdReset) == 0)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2086
			break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2087
		msleep_interruptible(1);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2088
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2089
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2090
	RTL_W16(IntrStatus, 0xffff);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2091
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2092
	/* Identify chip attached to board */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2093
	rtl8169_get_mac_version(tp, ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2094
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2095
	rtl8169_print_mac_version(tp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2096
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2097
	for (i = 0; i < ARRAY_SIZE(rtl_chip_info); i++) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2098
		if (tp->mac_version == rtl_chip_info[i].mac_version)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2099
			break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2100
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2101
	if (i == ARRAY_SIZE(rtl_chip_info)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2102
		/* Unknown chip: assume array element #0, original RTL-8169 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2103
		if (netif_msg_probe(tp)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2104
			dev_printk(KERN_DEBUG, &pdev->dev,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2105
				"unknown chip version, assuming %s\n",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2106
				rtl_chip_info[0].name);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2107
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2108
		i = 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2109
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2110
	tp->chipset = i;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2111
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2112
	RTL_W8(Cfg9346, Cfg9346_Unlock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2113
	RTL_W8(Config1, RTL_R8(Config1) | PMEnable);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2114
	RTL_W8(Config5, RTL_R8(Config5) & PMEStatus);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2115
	if ((RTL_R8(Config3) & (LinkUp | MagicPacket)) != 0)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2116
		tp->features |= RTL_FEATURE_WOL;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2117
	if ((RTL_R8(Config5) & (UWF | BWF | MWF)) != 0)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2118
		tp->features |= RTL_FEATURE_WOL;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2119
	tp->features |= rtl_try_msi(pdev, ioaddr, cfg);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2120
	RTL_W8(Cfg9346, Cfg9346_Lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2121
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2122
	if ((tp->mac_version <= RTL_GIGA_MAC_VER_06) &&
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2123
	    (RTL_R8(PHYstatus) & TBI_Enable)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2124
		tp->set_speed = rtl8169_set_speed_tbi;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2125
		tp->get_settings = rtl8169_gset_tbi;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2126
		tp->phy_reset_enable = rtl8169_tbi_reset_enable;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2127
		tp->phy_reset_pending = rtl8169_tbi_reset_pending;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2128
		tp->link_ok = rtl8169_tbi_link_ok;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2129
		tp->do_ioctl = rtl_tbi_ioctl;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2130
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2131
		tp->phy_1000_ctrl_reg = ADVERTISE_1000FULL; /* Implied by TBI */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2132
	} else {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2133
		tp->set_speed = rtl8169_set_speed_xmii;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2134
		tp->get_settings = rtl8169_gset_xmii;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2135
		tp->phy_reset_enable = rtl8169_xmii_reset_enable;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2136
		tp->phy_reset_pending = rtl8169_xmii_reset_pending;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2137
		tp->link_ok = rtl8169_xmii_link_ok;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2138
		tp->do_ioctl = rtl_xmii_ioctl;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2139
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2140
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2141
	spin_lock_init(&tp->lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2142
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2143
	tp->mmio_addr = ioaddr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2144
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2145
	/* Get MAC address */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2146
	for (i = 0; i < MAC_ADDR_LEN; i++)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2147
		dev->dev_addr[i] = RTL_R8(MAC0 + i);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2148
	memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2149
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2150
	SET_ETHTOOL_OPS(dev, &rtl8169_ethtool_ops);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2151
	dev->watchdog_timeo = RTL8169_TX_TIMEOUT;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2152
	dev->irq = pdev->irq;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2153
	dev->base_addr = (unsigned long) ioaddr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2154
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2155
	netif_napi_add(dev, &tp->napi, rtl8169_poll, R8169_NAPI_WEIGHT);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2156
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2157
#ifdef CONFIG_R8169_VLAN
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2158
	dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2159
#endif
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2160
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2161
	tp->intr_mask = 0xffff;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2162
	tp->align = cfg->align;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2163
	tp->hw_start = cfg->hw_start;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2164
	tp->intr_event = cfg->intr_event;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2165
	tp->napi_event = cfg->napi_event;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2166
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2167
	init_timer(&tp->timer);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2168
	tp->timer.data = (unsigned long) dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2169
	tp->timer.function = rtl8169_phy_timer;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2170
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2171
	rc = register_netdev(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2172
	if (rc < 0)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2173
		goto err_out_msi_5;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2174
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2175
	pci_set_drvdata(pdev, dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2176
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2177
	if (netif_msg_probe(tp)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2178
		u32 xid = RTL_R32(TxConfig) & 0x7cf0f8ff;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2179
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2180
		printk(KERN_INFO "%s: %s at 0x%lx, "
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2181
		       "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x, "
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2182
		       "XID %08x IRQ %d\n",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2183
		       dev->name,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2184
		       rtl_chip_info[tp->chipset].name,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2185
		       dev->base_addr,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2186
		       dev->dev_addr[0], dev->dev_addr[1],
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2187
		       dev->dev_addr[2], dev->dev_addr[3],
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2188
		       dev->dev_addr[4], dev->dev_addr[5], xid, dev->irq);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2189
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2190
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2191
	rtl8169_init_phy(dev, tp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2192
	device_set_wakeup_enable(&pdev->dev, tp->features & RTL_FEATURE_WOL);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2193
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2194
out:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2195
	return rc;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2196
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2197
err_out_msi_5:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2198
	rtl_disable_msi(pdev, tp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2199
	iounmap(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2200
err_out_free_res_4:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2201
	pci_release_regions(pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2202
err_out_mwi_3:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2203
	pci_clear_mwi(pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2204
err_out_disable_2:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2205
	pci_disable_device(pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2206
err_out_free_dev_1:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2207
	free_netdev(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2208
	goto out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2209
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2210
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2211
static void __devexit rtl8169_remove_one(struct pci_dev *pdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2212
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2213
	struct net_device *dev = pci_get_drvdata(pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2214
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2215
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2216
	flush_scheduled_work();
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2217
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2218
	unregister_netdev(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2219
	rtl_disable_msi(pdev, tp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2220
	rtl8169_release_board(pdev, dev, tp->mmio_addr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2221
	pci_set_drvdata(pdev, NULL);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2222
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2223
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2224
static void rtl8169_set_rxbufsize(struct rtl8169_private *tp,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2225
				  struct net_device *dev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2226
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2227
	unsigned int mtu = dev->mtu;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2228
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2229
	tp->rx_buf_sz = (mtu > RX_BUF_SIZE) ? mtu + ETH_HLEN + 8 : RX_BUF_SIZE;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2230
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2231
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2232
static int rtl8169_open(struct net_device *dev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2233
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2234
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2235
	struct pci_dev *pdev = tp->pci_dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2236
	int retval = -ENOMEM;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2237
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2238
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2239
	rtl8169_set_rxbufsize(tp, dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2240
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2241
	/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2242
	 * Rx and Tx desscriptors needs 256 bytes alignment.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2243
	 * pci_alloc_consistent provides more.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2244
	 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2245
	tp->TxDescArray = pci_alloc_consistent(pdev, R8169_TX_RING_BYTES,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2246
					       &tp->TxPhyAddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2247
	if (!tp->TxDescArray)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2248
		goto out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2249
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2250
	tp->RxDescArray = pci_alloc_consistent(pdev, R8169_RX_RING_BYTES,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2251
					       &tp->RxPhyAddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2252
	if (!tp->RxDescArray)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2253
		goto err_free_tx_0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2254
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2255
	retval = rtl8169_init_ring(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2256
	if (retval < 0)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2257
		goto err_free_rx_1;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2258
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2259
	INIT_DELAYED_WORK(&tp->task, NULL);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2260
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2261
	smp_mb();
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2262
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2263
	retval = request_irq(dev->irq, rtl8169_interrupt,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2264
			     (tp->features & RTL_FEATURE_MSI) ? 0 : IRQF_SHARED,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2265
			     dev->name, dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2266
	if (retval < 0)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2267
		goto err_release_ring_2;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2268
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2269
	napi_enable(&tp->napi);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2270
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2271
	rtl_hw_start(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2272
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2273
	rtl8169_request_timer(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2274
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2275
	rtl8169_check_link_status(dev, tp, tp->mmio_addr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2276
out:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2277
	return retval;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2278
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2279
err_release_ring_2:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2280
	rtl8169_rx_clear(tp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2281
err_free_rx_1:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2282
	pci_free_consistent(pdev, R8169_RX_RING_BYTES, tp->RxDescArray,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2283
			    tp->RxPhyAddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2284
err_free_tx_0:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2285
	pci_free_consistent(pdev, R8169_TX_RING_BYTES, tp->TxDescArray,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2286
			    tp->TxPhyAddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2287
	goto out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2288
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2289
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2290
static void rtl8169_hw_reset(void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2291
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2292
	/* Disable interrupts */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2293
	rtl8169_irq_mask_and_ack(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2294
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2295
	/* Reset the chipset */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2296
	RTL_W8(ChipCmd, CmdReset);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2297
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2298
	/* PCI commit */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2299
	RTL_R8(ChipCmd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2300
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2301
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2302
static void rtl_set_rx_tx_config_registers(struct rtl8169_private *tp)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2303
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2304
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2305
	u32 cfg = rtl8169_rx_config;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2306
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2307
	cfg |= (RTL_R32(RxConfig) & rtl_chip_info[tp->chipset].RxConfigMask);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2308
	RTL_W32(RxConfig, cfg);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2309
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2310
	/* Set DMA burst size and Interframe Gap Time */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2311
	RTL_W32(TxConfig, (TX_DMA_BURST << TxDMAShift) |
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2312
		(InterFrameGap << TxInterFrameGapShift));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2313
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2314
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2315
static void rtl_hw_start(struct net_device *dev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2316
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2317
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2318
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2319
	unsigned int i;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2320
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2321
	/* Soft reset the chip. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2322
	RTL_W8(ChipCmd, CmdReset);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2323
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2324
	/* Check that the chip has finished the reset. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2325
	for (i = 0; i < 100; i++) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2326
		if ((RTL_R8(ChipCmd) & CmdReset) == 0)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2327
			break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2328
		msleep_interruptible(1);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2329
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2330
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2331
	tp->hw_start(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2332
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2333
	netif_start_queue(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2334
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2335
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2336
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2337
static void rtl_set_rx_tx_desc_registers(struct rtl8169_private *tp,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2338
					 void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2339
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2340
	/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2341
	 * Magic spell: some iop3xx ARM board needs the TxDescAddrHigh
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2342
	 * register to be written before TxDescAddrLow to work.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2343
	 * Switching from MMIO to I/O access fixes the issue as well.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2344
	 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2345
	RTL_W32(TxDescStartAddrHigh, ((u64) tp->TxPhyAddr) >> 32);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2346
	RTL_W32(TxDescStartAddrLow, ((u64) tp->TxPhyAddr) & DMA_32BIT_MASK);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2347
	RTL_W32(RxDescAddrHigh, ((u64) tp->RxPhyAddr) >> 32);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2348
	RTL_W32(RxDescAddrLow, ((u64) tp->RxPhyAddr) & DMA_32BIT_MASK);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2349
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2350
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2351
static u16 rtl_rw_cpluscmd(void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2352
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2353
	u16 cmd;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2354
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2355
	cmd = RTL_R16(CPlusCmd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2356
	RTL_W16(CPlusCmd, cmd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2357
	return cmd;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2358
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2359
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2360
static void rtl_set_rx_max_size(void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2361
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2362
	/* Low hurts. Let's disable the filtering. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2363
	RTL_W16(RxMaxSize, 16383);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2364
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2365
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2366
static void rtl8169_set_magic_reg(void __iomem *ioaddr, unsigned mac_version)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2367
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2368
	struct {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2369
		u32 mac_version;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2370
		u32 clk;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2371
		u32 val;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2372
	} cfg2_info [] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2373
		{ RTL_GIGA_MAC_VER_05, PCI_Clock_33MHz, 0x000fff00 }, // 8110SCd
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2374
		{ RTL_GIGA_MAC_VER_05, PCI_Clock_66MHz, 0x000fffff },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2375
		{ RTL_GIGA_MAC_VER_06, PCI_Clock_33MHz, 0x00ffff00 }, // 8110SCe
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2376
		{ RTL_GIGA_MAC_VER_06, PCI_Clock_66MHz, 0x00ffffff }
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2377
	}, *p = cfg2_info;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2378
	unsigned int i;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2379
	u32 clk;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2380
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2381
	clk = RTL_R8(Config2) & PCI_Clock_66MHz;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2382
	for (i = 0; i < ARRAY_SIZE(cfg2_info); i++, p++) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2383
		if ((p->mac_version == mac_version) && (p->clk == clk)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2384
			RTL_W32(0x7c, p->val);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2385
			break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2386
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2387
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2388
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2389
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2390
static void rtl_hw_start_8169(struct net_device *dev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2391
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2392
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2393
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2394
	struct pci_dev *pdev = tp->pci_dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2395
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2396
	if (tp->mac_version == RTL_GIGA_MAC_VER_05) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2397
		RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) | PCIMulRW);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2398
		pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, 0x08);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2399
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2400
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2401
	RTL_W8(Cfg9346, Cfg9346_Unlock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2402
	if ((tp->mac_version == RTL_GIGA_MAC_VER_01) ||
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2403
	    (tp->mac_version == RTL_GIGA_MAC_VER_02) ||
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2404
	    (tp->mac_version == RTL_GIGA_MAC_VER_03) ||
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2405
	    (tp->mac_version == RTL_GIGA_MAC_VER_04))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2406
		RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2407
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2408
	RTL_W8(EarlyTxThres, EarlyTxThld);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2409
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2410
	rtl_set_rx_max_size(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2411
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2412
	if ((tp->mac_version == RTL_GIGA_MAC_VER_01) ||
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2413
	    (tp->mac_version == RTL_GIGA_MAC_VER_02) ||
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2414
	    (tp->mac_version == RTL_GIGA_MAC_VER_03) ||
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2415
	    (tp->mac_version == RTL_GIGA_MAC_VER_04))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2416
		rtl_set_rx_tx_config_registers(tp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2417
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2418
	tp->cp_cmd |= rtl_rw_cpluscmd(ioaddr) | PCIMulRW;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2419
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2420
	if ((tp->mac_version == RTL_GIGA_MAC_VER_02) ||
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2421
	    (tp->mac_version == RTL_GIGA_MAC_VER_03)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2422
		dprintk("Set MAC Reg C+CR Offset 0xE0. "
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2423
			"Bit-3 and bit-14 MUST be 1\n");
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2424
		tp->cp_cmd |= (1 << 14);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2425
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2426
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2427
	RTL_W16(CPlusCmd, tp->cp_cmd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2428
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2429
	rtl8169_set_magic_reg(ioaddr, tp->mac_version);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2430
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2431
	/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2432
	 * Undocumented corner. Supposedly:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2433
	 * (TxTimer << 12) | (TxPackets << 8) | (RxTimer << 4) | RxPackets
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2434
	 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2435
	RTL_W16(IntrMitigate, 0x0000);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2436
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2437
	rtl_set_rx_tx_desc_registers(tp, ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2438
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2439
	if ((tp->mac_version != RTL_GIGA_MAC_VER_01) &&
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2440
	    (tp->mac_version != RTL_GIGA_MAC_VER_02) &&
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2441
	    (tp->mac_version != RTL_GIGA_MAC_VER_03) &&
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2442
	    (tp->mac_version != RTL_GIGA_MAC_VER_04)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2443
		RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2444
		rtl_set_rx_tx_config_registers(tp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2445
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2446
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2447
	RTL_W8(Cfg9346, Cfg9346_Lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2448
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2449
	/* Initially a 10 us delay. Turned it into a PCI commit. - FR */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2450
	RTL_R8(IntrMask);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2451
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2452
	RTL_W32(RxMissed, 0);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2453
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2454
	rtl_set_rx_mode(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2455
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2456
	/* no early-rx interrupts */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2457
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xF000);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2458
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2459
	/* Enable all known interrupts by setting the interrupt mask. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2460
	RTL_W16(IntrMask, tp->intr_event);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2461
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2462
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2463
static void rtl_tx_performance_tweak(struct pci_dev *pdev, u16 force)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2464
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2465
	struct net_device *dev = pci_get_drvdata(pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2466
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2467
	int cap = tp->pcie_cap;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2468
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2469
	if (cap) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2470
		u16 ctl;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2471
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2472
		pci_read_config_word(pdev, cap + PCI_EXP_DEVCTL, &ctl);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2473
		ctl = (ctl & ~PCI_EXP_DEVCTL_READRQ) | force;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2474
		pci_write_config_word(pdev, cap + PCI_EXP_DEVCTL, ctl);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2475
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2476
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2477
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2478
static void rtl_csi_access_enable(void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2479
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2480
	u32 csi;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2481
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2482
	csi = rtl_csi_read(ioaddr, 0x070c) & 0x00ffffff;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2483
	rtl_csi_write(ioaddr, 0x070c, csi | 0x27000000);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2484
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2485
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2486
struct ephy_info {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2487
	unsigned int offset;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2488
	u16 mask;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2489
	u16 bits;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2490
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2491
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2492
static void rtl_ephy_init(void __iomem *ioaddr, struct ephy_info *e, int len)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2493
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2494
	u16 w;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2495
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2496
	while (len-- > 0) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2497
		w = (rtl_ephy_read(ioaddr, e->offset) & ~e->mask) | e->bits;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2498
		rtl_ephy_write(ioaddr, e->offset, w);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2499
		e++;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2500
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2501
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2502
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2503
static void rtl_disable_clock_request(struct pci_dev *pdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2504
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2505
	struct net_device *dev = pci_get_drvdata(pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2506
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2507
	int cap = tp->pcie_cap;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2508
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2509
	if (cap) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2510
		u16 ctl;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2511
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2512
		pci_read_config_word(pdev, cap + PCI_EXP_LNKCTL, &ctl);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2513
		ctl &= ~PCI_EXP_LNKCTL_CLKREQ_EN;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2514
		pci_write_config_word(pdev, cap + PCI_EXP_LNKCTL, ctl);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2515
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2516
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2517
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2518
#define R8168_CPCMD_QUIRK_MASK (\
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2519
	EnableBist | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2520
	Mac_dbgo_oe | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2521
	Force_half_dup | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2522
	Force_rxflow_en | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2523
	Force_txflow_en | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2524
	Cxpl_dbg_sel | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2525
	ASF | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2526
	PktCntrDisable | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2527
	Mac_dbgo_sel)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2528
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2529
static void rtl_hw_start_8168bb(void __iomem *ioaddr, struct pci_dev *pdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2530
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2531
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2532
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2533
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2534
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2535
	rtl_tx_performance_tweak(pdev,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2536
		(0x5 << MAX_READ_REQUEST_SHIFT) | PCI_EXP_DEVCTL_NOSNOOP_EN);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2537
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2538
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2539
static void rtl_hw_start_8168bef(void __iomem *ioaddr, struct pci_dev *pdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2540
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2541
	rtl_hw_start_8168bb(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2542
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2543
	RTL_W8(EarlyTxThres, EarlyTxThld);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2544
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2545
	RTL_W8(Config4, RTL_R8(Config4) & ~(1 << 0));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2546
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2547
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2548
static void __rtl_hw_start_8168cp(void __iomem *ioaddr, struct pci_dev *pdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2549
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2550
	RTL_W8(Config1, RTL_R8(Config1) | Speed_down);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2551
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2552
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2553
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2554
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2555
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2556
	rtl_disable_clock_request(pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2557
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2558
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2559
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2560
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2561
static void rtl_hw_start_8168cp_1(void __iomem *ioaddr, struct pci_dev *pdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2562
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2563
	static struct ephy_info e_info_8168cp[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2564
		{ 0x01, 0,	0x0001 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2565
		{ 0x02, 0x0800,	0x1000 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2566
		{ 0x03, 0,	0x0042 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2567
		{ 0x06, 0x0080,	0x0000 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2568
		{ 0x07, 0,	0x2000 }
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2569
	};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2570
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2571
	rtl_csi_access_enable(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2572
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2573
	rtl_ephy_init(ioaddr, e_info_8168cp, ARRAY_SIZE(e_info_8168cp));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2574
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2575
	__rtl_hw_start_8168cp(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2576
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2577
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2578
static void rtl_hw_start_8168cp_2(void __iomem *ioaddr, struct pci_dev *pdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2579
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2580
	rtl_csi_access_enable(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2581
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2582
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2583
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2584
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2585
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2586
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2587
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2588
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2589
static void rtl_hw_start_8168cp_3(void __iomem *ioaddr, struct pci_dev *pdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2590
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2591
	rtl_csi_access_enable(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2592
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2593
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2594
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2595
	/* Magic. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2596
	RTL_W8(DBG_REG, 0x20);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2597
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2598
	RTL_W8(EarlyTxThres, EarlyTxThld);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2599
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2600
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2601
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2602
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2603
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2604
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2605
static void rtl_hw_start_8168c_1(void __iomem *ioaddr, struct pci_dev *pdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2606
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2607
	static struct ephy_info e_info_8168c_1[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2608
		{ 0x02, 0x0800,	0x1000 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2609
		{ 0x03, 0,	0x0002 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2610
		{ 0x06, 0x0080,	0x0000 }
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2611
	};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2612
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2613
	rtl_csi_access_enable(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2614
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2615
	RTL_W8(DBG_REG, 0x06 | FIX_NAK_1 | FIX_NAK_2);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2616
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2617
	rtl_ephy_init(ioaddr, e_info_8168c_1, ARRAY_SIZE(e_info_8168c_1));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2618
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2619
	__rtl_hw_start_8168cp(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2620
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2621
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2622
static void rtl_hw_start_8168c_2(void __iomem *ioaddr, struct pci_dev *pdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2623
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2624
	static struct ephy_info e_info_8168c_2[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2625
		{ 0x01, 0,	0x0001 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2626
		{ 0x03, 0x0400,	0x0220 }
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2627
	};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2628
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2629
	rtl_csi_access_enable(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2630
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2631
	rtl_ephy_init(ioaddr, e_info_8168c_2, ARRAY_SIZE(e_info_8168c_2));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2632
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2633
	__rtl_hw_start_8168cp(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2634
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2635
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2636
static void rtl_hw_start_8168c_3(void __iomem *ioaddr, struct pci_dev *pdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2637
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2638
	rtl_hw_start_8168c_2(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2639
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2640
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2641
static void rtl_hw_start_8168c_4(void __iomem *ioaddr, struct pci_dev *pdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2642
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2643
	rtl_csi_access_enable(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2644
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2645
	__rtl_hw_start_8168cp(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2646
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2647
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2648
static void rtl_hw_start_8168d(void __iomem *ioaddr, struct pci_dev *pdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2649
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2650
	rtl_csi_access_enable(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2651
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2652
	rtl_disable_clock_request(pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2653
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2654
	RTL_W8(EarlyTxThres, EarlyTxThld);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2655
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2656
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2657
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2658
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2659
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2660
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2661
static void rtl_hw_start_8168(struct net_device *dev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2662
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2663
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2664
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2665
	struct pci_dev *pdev = tp->pci_dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2666
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2667
	RTL_W8(Cfg9346, Cfg9346_Unlock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2668
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2669
	RTL_W8(EarlyTxThres, EarlyTxThld);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2670
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2671
	rtl_set_rx_max_size(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2672
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2673
	tp->cp_cmd |= RTL_R16(CPlusCmd) | PktCntrDisable | INTT_1;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2674
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2675
	RTL_W16(CPlusCmd, tp->cp_cmd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2676
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2677
	RTL_W16(IntrMitigate, 0x5151);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2678
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2679
	/* Work around for RxFIFO overflow. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2680
	if (tp->mac_version == RTL_GIGA_MAC_VER_11) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2681
		tp->intr_event |= RxFIFOOver | PCSTimeout;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2682
		tp->intr_event &= ~RxOverflow;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2683
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2684
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2685
	rtl_set_rx_tx_desc_registers(tp, ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2686
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2687
	rtl_set_rx_mode(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2688
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2689
	RTL_W32(TxConfig, (TX_DMA_BURST << TxDMAShift) |
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2690
		(InterFrameGap << TxInterFrameGapShift));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2691
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2692
	RTL_R8(IntrMask);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2693
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2694
	switch (tp->mac_version) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2695
	case RTL_GIGA_MAC_VER_11:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2696
		rtl_hw_start_8168bb(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2697
	break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2698
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2699
	case RTL_GIGA_MAC_VER_12:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2700
	case RTL_GIGA_MAC_VER_17:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2701
		rtl_hw_start_8168bef(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2702
	break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2703
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2704
	case RTL_GIGA_MAC_VER_18:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2705
		rtl_hw_start_8168cp_1(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2706
	break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2707
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2708
	case RTL_GIGA_MAC_VER_19:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2709
		rtl_hw_start_8168c_1(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2710
	break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2711
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2712
	case RTL_GIGA_MAC_VER_20:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2713
		rtl_hw_start_8168c_2(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2714
	break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2715
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2716
	case RTL_GIGA_MAC_VER_21:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2717
		rtl_hw_start_8168c_3(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2718
	break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2719
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2720
	case RTL_GIGA_MAC_VER_22:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2721
		rtl_hw_start_8168c_4(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2722
	break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2723
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2724
	case RTL_GIGA_MAC_VER_23:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2725
		rtl_hw_start_8168cp_2(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2726
	break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2727
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2728
	case RTL_GIGA_MAC_VER_24:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2729
		rtl_hw_start_8168cp_3(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2730
	break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2731
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2732
	case RTL_GIGA_MAC_VER_25:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2733
		rtl_hw_start_8168d(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2734
	break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2735
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2736
	default:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2737
		printk(KERN_ERR PFX "%s: unknown chipset (mac_version = %d).\n",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2738
			dev->name, tp->mac_version);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2739
	break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2740
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2741
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2742
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2743
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2744
	RTL_W8(Cfg9346, Cfg9346_Lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2745
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2746
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xF000);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2747
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2748
	RTL_W16(IntrMask, tp->intr_event);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2749
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2750
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2751
#define R810X_CPCMD_QUIRK_MASK (\
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2752
	EnableBist | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2753
	Mac_dbgo_oe | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2754
	Force_half_dup | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2755
	Force_half_dup | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2756
	Force_txflow_en | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2757
	Cxpl_dbg_sel | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2758
	ASF | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2759
	PktCntrDisable | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2760
	PCIDAC | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2761
	PCIMulRW)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2762
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2763
static void rtl_hw_start_8102e_1(void __iomem *ioaddr, struct pci_dev *pdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2764
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2765
	static struct ephy_info e_info_8102e_1[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2766
		{ 0x01,	0, 0x6e65 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2767
		{ 0x02,	0, 0x091f },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2768
		{ 0x03,	0, 0xc2f9 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2769
		{ 0x06,	0, 0xafb5 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2770
		{ 0x07,	0, 0x0e00 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2771
		{ 0x19,	0, 0xec80 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2772
		{ 0x01,	0, 0x2e65 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2773
		{ 0x01,	0, 0x6e65 }
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2774
	};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2775
	u8 cfg1;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2776
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2777
	rtl_csi_access_enable(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2778
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2779
	RTL_W8(DBG_REG, FIX_NAK_1);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2780
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2781
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2782
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2783
	RTL_W8(Config1,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2784
	       LEDS1 | LEDS0 | Speed_down | MEMMAP | IOMAP | VPD | PMEnable);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2785
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2786
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2787
	cfg1 = RTL_R8(Config1);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2788
	if ((cfg1 & LEDS0) && (cfg1 & LEDS1))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2789
		RTL_W8(Config1, cfg1 & ~LEDS0);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2790
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2791
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R810X_CPCMD_QUIRK_MASK);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2792
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2793
	rtl_ephy_init(ioaddr, e_info_8102e_1, ARRAY_SIZE(e_info_8102e_1));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2794
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2795
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2796
static void rtl_hw_start_8102e_2(void __iomem *ioaddr, struct pci_dev *pdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2797
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2798
	rtl_csi_access_enable(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2799
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2800
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2801
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2802
	RTL_W8(Config1, MEMMAP | IOMAP | VPD | PMEnable);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2803
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2804
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2805
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R810X_CPCMD_QUIRK_MASK);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2806
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2807
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2808
static void rtl_hw_start_8102e_3(void __iomem *ioaddr, struct pci_dev *pdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2809
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2810
	rtl_hw_start_8102e_2(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2811
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2812
	rtl_ephy_write(ioaddr, 0x03, 0xc2f9);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2813
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2814
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2815
static void rtl_hw_start_8101(struct net_device *dev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2816
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2817
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2818
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2819
	struct pci_dev *pdev = tp->pci_dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2820
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2821
	if ((tp->mac_version == RTL_GIGA_MAC_VER_13) ||
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2822
	    (tp->mac_version == RTL_GIGA_MAC_VER_16)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2823
		int cap = tp->pcie_cap;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2824
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2825
		if (cap) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2826
			pci_write_config_word(pdev, cap + PCI_EXP_DEVCTL,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2827
					      PCI_EXP_DEVCTL_NOSNOOP_EN);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2828
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2829
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2830
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2831
	switch (tp->mac_version) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2832
	case RTL_GIGA_MAC_VER_07:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2833
		rtl_hw_start_8102e_1(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2834
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2835
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2836
	case RTL_GIGA_MAC_VER_08:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2837
		rtl_hw_start_8102e_3(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2838
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2839
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2840
	case RTL_GIGA_MAC_VER_09:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2841
		rtl_hw_start_8102e_2(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2842
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2843
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2844
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2845
	RTL_W8(Cfg9346, Cfg9346_Unlock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2846
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2847
	RTL_W8(EarlyTxThres, EarlyTxThld);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2848
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2849
	rtl_set_rx_max_size(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2850
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2851
	tp->cp_cmd |= rtl_rw_cpluscmd(ioaddr) | PCIMulRW;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2852
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2853
	RTL_W16(CPlusCmd, tp->cp_cmd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2854
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2855
	RTL_W16(IntrMitigate, 0x0000);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2856
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2857
	rtl_set_rx_tx_desc_registers(tp, ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2858
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2859
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2860
	rtl_set_rx_tx_config_registers(tp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2861
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2862
	RTL_W8(Cfg9346, Cfg9346_Lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2863
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2864
	RTL_R8(IntrMask);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2865
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2866
	rtl_set_rx_mode(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2867
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2868
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2869
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2870
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xf000);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2871
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2872
	RTL_W16(IntrMask, tp->intr_event);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2873
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2874
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2875
static int rtl8169_change_mtu(struct net_device *dev, int new_mtu)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2876
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2877
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2878
	int ret = 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2879
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2880
	if (new_mtu < ETH_ZLEN || new_mtu > SafeMtu)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2881
		return -EINVAL;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2882
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2883
	dev->mtu = new_mtu;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2884
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2885
	if (!netif_running(dev))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2886
		goto out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2887
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2888
	rtl8169_down(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2889
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2890
	rtl8169_set_rxbufsize(tp, dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2891
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2892
	ret = rtl8169_init_ring(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2893
	if (ret < 0)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2894
		goto out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2895
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2896
	napi_enable(&tp->napi);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2897
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2898
	rtl_hw_start(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2899
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2900
	rtl8169_request_timer(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2901
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2902
out:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2903
	return ret;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2904
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2905
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2906
static inline void rtl8169_make_unusable_by_asic(struct RxDesc *desc)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2907
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2908
	desc->addr = cpu_to_le64(0x0badbadbadbadbadull);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2909
	desc->opts1 &= ~cpu_to_le32(DescOwn | RsvdMask);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2910
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2911
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2912
static void rtl8169_free_rx_skb(struct rtl8169_private *tp,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2913
				struct sk_buff **sk_buff, struct RxDesc *desc)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2914
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2915
	struct pci_dev *pdev = tp->pci_dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2916
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2917
	pci_unmap_single(pdev, le64_to_cpu(desc->addr), tp->rx_buf_sz,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2918
			 PCI_DMA_FROMDEVICE);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2919
	dev_kfree_skb(*sk_buff);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2920
	*sk_buff = NULL;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2921
	rtl8169_make_unusable_by_asic(desc);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2922
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2923
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2924
static inline void rtl8169_mark_to_asic(struct RxDesc *desc, u32 rx_buf_sz)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2925
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2926
	u32 eor = le32_to_cpu(desc->opts1) & RingEnd;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2927
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2928
	desc->opts1 = cpu_to_le32(DescOwn | eor | rx_buf_sz);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2929
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2930
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2931
static inline void rtl8169_map_to_asic(struct RxDesc *desc, dma_addr_t mapping,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2932
				       u32 rx_buf_sz)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2933
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2934
	desc->addr = cpu_to_le64(mapping);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2935
	wmb();
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2936
	rtl8169_mark_to_asic(desc, rx_buf_sz);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2937
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2938
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2939
static struct sk_buff *rtl8169_alloc_rx_skb(struct pci_dev *pdev,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2940
					    struct net_device *dev,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2941
					    struct RxDesc *desc, int rx_buf_sz,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2942
					    unsigned int align)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2943
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2944
	struct sk_buff *skb;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2945
	dma_addr_t mapping;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2946
	unsigned int pad;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2947
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2948
	pad = align ? align : NET_IP_ALIGN;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2949
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2950
	skb = netdev_alloc_skb(dev, rx_buf_sz + pad);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2951
	if (!skb)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2952
		goto err_out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2953
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2954
	skb_reserve(skb, align ? ((pad - 1) & (unsigned long)skb->data) : pad);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2955
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2956
	mapping = pci_map_single(pdev, skb->data, rx_buf_sz,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2957
				 PCI_DMA_FROMDEVICE);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2958
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2959
	rtl8169_map_to_asic(desc, mapping, rx_buf_sz);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2960
out:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2961
	return skb;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2962
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2963
err_out:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2964
	rtl8169_make_unusable_by_asic(desc);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2965
	goto out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2966
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2967
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2968
static void rtl8169_rx_clear(struct rtl8169_private *tp)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2969
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2970
	unsigned int i;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2971
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2972
	for (i = 0; i < NUM_RX_DESC; i++) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2973
		if (tp->Rx_skbuff[i]) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2974
			rtl8169_free_rx_skb(tp, tp->Rx_skbuff + i,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2975
					    tp->RxDescArray + i);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2976
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2977
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2978
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2979
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2980
static u32 rtl8169_rx_fill(struct rtl8169_private *tp, struct net_device *dev,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2981
			   u32 start, u32 end)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2982
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2983
	u32 cur;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2984
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2985
	for (cur = start; end - cur != 0; cur++) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2986
		struct sk_buff *skb;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2987
		unsigned int i = cur % NUM_RX_DESC;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2988
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2989
		WARN_ON((s32)(end - cur) < 0);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2990
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2991
		if (tp->Rx_skbuff[i])
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2992
			continue;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2993
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2994
		skb = rtl8169_alloc_rx_skb(tp->pci_dev, dev,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2995
					   tp->RxDescArray + i,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2996
					   tp->rx_buf_sz, tp->align);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2997
		if (!skb)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2998
			break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2999
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3000
		tp->Rx_skbuff[i] = skb;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3001
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3002
	return cur - start;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3003
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3004
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3005
static inline void rtl8169_mark_as_last_descriptor(struct RxDesc *desc)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3006
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3007
	desc->opts1 |= cpu_to_le32(RingEnd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3008
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3009
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3010
static void rtl8169_init_ring_indexes(struct rtl8169_private *tp)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3011
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3012
	tp->dirty_tx = tp->dirty_rx = tp->cur_tx = tp->cur_rx = 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3013
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3014
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3015
static int rtl8169_init_ring(struct net_device *dev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3016
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3017
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3018
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3019
	rtl8169_init_ring_indexes(tp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3020
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3021
	memset(tp->tx_skb, 0x0, NUM_TX_DESC * sizeof(struct ring_info));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3022
	memset(tp->Rx_skbuff, 0x0, NUM_RX_DESC * sizeof(struct sk_buff *));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3023
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3024
	if (rtl8169_rx_fill(tp, dev, 0, NUM_RX_DESC) != NUM_RX_DESC)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3025
		goto err_out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3026
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3027
	rtl8169_mark_as_last_descriptor(tp->RxDescArray + NUM_RX_DESC - 1);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3028
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3029
	return 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3030
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3031
err_out:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3032
	rtl8169_rx_clear(tp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3033
	return -ENOMEM;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3034
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3035
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3036
static void rtl8169_unmap_tx_skb(struct pci_dev *pdev, struct ring_info *tx_skb,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3037
				 struct TxDesc *desc)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3038
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3039
	unsigned int len = tx_skb->len;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3040
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3041
	pci_unmap_single(pdev, le64_to_cpu(desc->addr), len, PCI_DMA_TODEVICE);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3042
	desc->opts1 = 0x00;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3043
	desc->opts2 = 0x00;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3044
	desc->addr = 0x00;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3045
	tx_skb->len = 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3046
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3047
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3048
static void rtl8169_tx_clear(struct rtl8169_private *tp)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3049
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3050
	unsigned int i;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3051
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3052
	for (i = tp->dirty_tx; i < tp->dirty_tx + NUM_TX_DESC; i++) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3053
		unsigned int entry = i % NUM_TX_DESC;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3054
		struct ring_info *tx_skb = tp->tx_skb + entry;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3055
		unsigned int len = tx_skb->len;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3056
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3057
		if (len) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3058
			struct sk_buff *skb = tx_skb->skb;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3059
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3060
			rtl8169_unmap_tx_skb(tp->pci_dev, tx_skb,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3061
					     tp->TxDescArray + entry);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3062
			if (skb) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3063
				dev_kfree_skb(skb);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3064
				tx_skb->skb = NULL;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3065
			}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3066
			tp->dev->stats.tx_dropped++;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3067
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3068
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3069
	tp->cur_tx = tp->dirty_tx = 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3070
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3071
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3072
static void rtl8169_schedule_work(struct net_device *dev, work_func_t task)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3073
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3074
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3075
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3076
	PREPARE_DELAYED_WORK(&tp->task, task);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3077
	schedule_delayed_work(&tp->task, 4);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3078
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3079
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3080
static void rtl8169_wait_for_quiescence(struct net_device *dev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3081
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3082
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3083
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3084
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3085
	synchronize_irq(dev->irq);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3086
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3087
	/* Wait for any pending NAPI task to complete */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3088
	napi_disable(&tp->napi);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3089
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3090
	rtl8169_irq_mask_and_ack(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3091
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3092
	tp->intr_mask = 0xffff;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3093
	RTL_W16(IntrMask, tp->intr_event);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3094
	napi_enable(&tp->napi);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3095
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3096
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3097
static void rtl8169_reinit_task(struct work_struct *work)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3098
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3099
	struct rtl8169_private *tp =
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3100
		container_of(work, struct rtl8169_private, task.work);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3101
	struct net_device *dev = tp->dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3102
	int ret;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3103
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3104
	rtnl_lock();
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3105
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3106
	if (!netif_running(dev))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3107
		goto out_unlock;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3108
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3109
	rtl8169_wait_for_quiescence(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3110
	rtl8169_close(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3111
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3112
	ret = rtl8169_open(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3113
	if (unlikely(ret < 0)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3114
		if (net_ratelimit() && netif_msg_drv(tp)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3115
			printk(KERN_ERR PFX "%s: reinit failure (status = %d)."
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3116
			       " Rescheduling.\n", dev->name, ret);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3117
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3118
		rtl8169_schedule_work(dev, rtl8169_reinit_task);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3119
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3120
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3121
out_unlock:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3122
	rtnl_unlock();
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3123
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3124
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3125
static void rtl8169_reset_task(struct work_struct *work)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3126
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3127
	struct rtl8169_private *tp =
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3128
		container_of(work, struct rtl8169_private, task.work);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3129
	struct net_device *dev = tp->dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3130
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3131
	rtnl_lock();
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3132
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3133
	if (!netif_running(dev))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3134
		goto out_unlock;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3135
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3136
	rtl8169_wait_for_quiescence(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3137
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3138
	rtl8169_rx_interrupt(dev, tp, tp->mmio_addr, ~(u32)0);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3139
	rtl8169_tx_clear(tp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3140
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3141
	if (tp->dirty_rx == tp->cur_rx) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3142
		rtl8169_init_ring_indexes(tp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3143
		rtl_hw_start(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3144
		netif_wake_queue(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3145
		rtl8169_check_link_status(dev, tp, tp->mmio_addr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3146
	} else {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3147
		if (net_ratelimit() && netif_msg_intr(tp)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3148
			printk(KERN_EMERG PFX "%s: Rx buffers shortage\n",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3149
			       dev->name);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3150
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3151
		rtl8169_schedule_work(dev, rtl8169_reset_task);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3152
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3153
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3154
out_unlock:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3155
	rtnl_unlock();
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3156
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3157
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3158
static void rtl8169_tx_timeout(struct net_device *dev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3159
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3160
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3161
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3162
	rtl8169_hw_reset(tp->mmio_addr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3163
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3164
	/* Let's wait a bit while any (async) irq lands on */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3165
	rtl8169_schedule_work(dev, rtl8169_reset_task);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3166
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3167
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3168
static int rtl8169_xmit_frags(struct rtl8169_private *tp, struct sk_buff *skb,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3169
			      u32 opts1)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3170
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3171
	struct skb_shared_info *info = skb_shinfo(skb);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3172
	unsigned int cur_frag, entry;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3173
	struct TxDesc * uninitialized_var(txd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3174
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3175
	entry = tp->cur_tx;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3176
	for (cur_frag = 0; cur_frag < info->nr_frags; cur_frag++) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3177
		skb_frag_t *frag = info->frags + cur_frag;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3178
		dma_addr_t mapping;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3179
		u32 status, len;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3180
		void *addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3181
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3182
		entry = (entry + 1) % NUM_TX_DESC;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3183
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3184
		txd = tp->TxDescArray + entry;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3185
		len = frag->size;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3186
		addr = ((void *) page_address(frag->page)) + frag->page_offset;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3187
		mapping = pci_map_single(tp->pci_dev, addr, len, PCI_DMA_TODEVICE);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3188
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3189
		/* anti gcc 2.95.3 bugware (sic) */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3190
		status = opts1 | len | (RingEnd * !((entry + 1) % NUM_TX_DESC));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3191
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3192
		txd->opts1 = cpu_to_le32(status);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3193
		txd->addr = cpu_to_le64(mapping);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3194
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3195
		tp->tx_skb[entry].len = len;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3196
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3197
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3198
	if (cur_frag) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3199
		tp->tx_skb[entry].skb = skb;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3200
		txd->opts1 |= cpu_to_le32(LastFrag);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3201
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3202
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3203
	return cur_frag;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3204
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3205
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3206
static inline u32 rtl8169_tso_csum(struct sk_buff *skb, struct net_device *dev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3207
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3208
	if (dev->features & NETIF_F_TSO) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3209
		u32 mss = skb_shinfo(skb)->gso_size;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3210
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3211
		if (mss)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3212
			return LargeSend | ((mss & MSSMask) << MSSShift);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3213
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3214
	if (skb->ip_summed == CHECKSUM_PARTIAL) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3215
		const struct iphdr *ip = ip_hdr(skb);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3216
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3217
		if (ip->protocol == IPPROTO_TCP)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3218
			return IPCS | TCPCS;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3219
		else if (ip->protocol == IPPROTO_UDP)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3220
			return IPCS | UDPCS;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3221
		WARN_ON(1);	/* we need a WARN() */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3222
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3223
	return 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3224
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3225
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3226
static int rtl8169_start_xmit(struct sk_buff *skb, struct net_device *dev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3227
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3228
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3229
	unsigned int frags, entry = tp->cur_tx % NUM_TX_DESC;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3230
	struct TxDesc *txd = tp->TxDescArray + entry;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3231
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3232
	dma_addr_t mapping;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3233
	u32 status, len;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3234
	u32 opts1;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3235
	int ret = NETDEV_TX_OK;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3236
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3237
	if (unlikely(TX_BUFFS_AVAIL(tp) < skb_shinfo(skb)->nr_frags)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3238
		if (netif_msg_drv(tp)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3239
			printk(KERN_ERR
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3240
			       "%s: BUG! Tx Ring full when queue awake!\n",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3241
			       dev->name);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3242
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3243
		goto err_stop;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3244
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3245
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3246
	if (unlikely(le32_to_cpu(txd->opts1) & DescOwn))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3247
		goto err_stop;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3248
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3249
	opts1 = DescOwn | rtl8169_tso_csum(skb, dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3250
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3251
	frags = rtl8169_xmit_frags(tp, skb, opts1);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3252
	if (frags) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3253
		len = skb_headlen(skb);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3254
		opts1 |= FirstFrag;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3255
	} else {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3256
		len = skb->len;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3257
		opts1 |= FirstFrag | LastFrag;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3258
		tp->tx_skb[entry].skb = skb;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3259
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3260
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3261
	mapping = pci_map_single(tp->pci_dev, skb->data, len, PCI_DMA_TODEVICE);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3262
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3263
	tp->tx_skb[entry].len = len;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3264
	txd->addr = cpu_to_le64(mapping);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3265
	txd->opts2 = cpu_to_le32(rtl8169_tx_vlan_tag(tp, skb));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3266
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3267
	wmb();
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3268
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3269
	/* anti gcc 2.95.3 bugware (sic) */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3270
	status = opts1 | len | (RingEnd * !((entry + 1) % NUM_TX_DESC));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3271
	txd->opts1 = cpu_to_le32(status);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3272
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3273
	dev->trans_start = jiffies;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3274
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3275
	tp->cur_tx += frags + 1;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3276
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3277
	smp_wmb();
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3278
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3279
	RTL_W8(TxPoll, NPQ);	/* set polling bit */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3280
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3281
	if (TX_BUFFS_AVAIL(tp) < MAX_SKB_FRAGS) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3282
		netif_stop_queue(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3283
		smp_rmb();
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3284
		if (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3285
			netif_wake_queue(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3286
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3287
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3288
out:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3289
	return ret;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3290
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3291
err_stop:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3292
	netif_stop_queue(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3293
	ret = NETDEV_TX_BUSY;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3294
	dev->stats.tx_dropped++;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3295
	goto out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3296
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3297
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3298
static void rtl8169_pcierr_interrupt(struct net_device *dev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3299
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3300
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3301
	struct pci_dev *pdev = tp->pci_dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3302
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3303
	u16 pci_status, pci_cmd;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3304
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3305
	pci_read_config_word(pdev, PCI_COMMAND, &pci_cmd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3306
	pci_read_config_word(pdev, PCI_STATUS, &pci_status);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3307
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3308
	if (netif_msg_intr(tp)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3309
		printk(KERN_ERR
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3310
		       "%s: PCI error (cmd = 0x%04x, status = 0x%04x).\n",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3311
		       dev->name, pci_cmd, pci_status);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3312
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3313
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3314
	/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3315
	 * The recovery sequence below admits a very elaborated explanation:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3316
	 * - it seems to work;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3317
	 * - I did not see what else could be done;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3318
	 * - it makes iop3xx happy.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3319
	 *
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3320
	 * Feel free to adjust to your needs.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3321
	 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3322
	if (pdev->broken_parity_status)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3323
		pci_cmd &= ~PCI_COMMAND_PARITY;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3324
	else
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3325
		pci_cmd |= PCI_COMMAND_SERR | PCI_COMMAND_PARITY;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3326
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3327
	pci_write_config_word(pdev, PCI_COMMAND, pci_cmd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3328
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3329
	pci_write_config_word(pdev, PCI_STATUS,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3330
		pci_status & (PCI_STATUS_DETECTED_PARITY |
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3331
		PCI_STATUS_SIG_SYSTEM_ERROR | PCI_STATUS_REC_MASTER_ABORT |
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3332
		PCI_STATUS_REC_TARGET_ABORT | PCI_STATUS_SIG_TARGET_ABORT));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3333
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3334
	/* The infamous DAC f*ckup only happens at boot time */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3335
	if ((tp->cp_cmd & PCIDAC) && !tp->dirty_rx && !tp->cur_rx) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3336
		if (netif_msg_intr(tp))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3337
			printk(KERN_INFO "%s: disabling PCI DAC.\n", dev->name);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3338
		tp->cp_cmd &= ~PCIDAC;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3339
		RTL_W16(CPlusCmd, tp->cp_cmd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3340
		dev->features &= ~NETIF_F_HIGHDMA;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3341
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3342
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3343
	rtl8169_hw_reset(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3344
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3345
	rtl8169_schedule_work(dev, rtl8169_reinit_task);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3346
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3347
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3348
static void rtl8169_tx_interrupt(struct net_device *dev,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3349
				 struct rtl8169_private *tp,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3350
				 void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3351
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3352
	unsigned int dirty_tx, tx_left;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3353
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3354
	dirty_tx = tp->dirty_tx;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3355
	smp_rmb();
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3356
	tx_left = tp->cur_tx - dirty_tx;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3357
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3358
	while (tx_left > 0) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3359
		unsigned int entry = dirty_tx % NUM_TX_DESC;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3360
		struct ring_info *tx_skb = tp->tx_skb + entry;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3361
		u32 len = tx_skb->len;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3362
		u32 status;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3363
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3364
		rmb();
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3365
		status = le32_to_cpu(tp->TxDescArray[entry].opts1);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3366
		if (status & DescOwn)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3367
			break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3368
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3369
		dev->stats.tx_bytes += len;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3370
		dev->stats.tx_packets++;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3371
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3372
		rtl8169_unmap_tx_skb(tp->pci_dev, tx_skb, tp->TxDescArray + entry);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3373
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3374
		if (status & LastFrag) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3375
			dev_kfree_skb_irq(tx_skb->skb);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3376
			tx_skb->skb = NULL;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3377
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3378
		dirty_tx++;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3379
		tx_left--;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3380
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3381
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3382
	if (tp->dirty_tx != dirty_tx) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3383
		tp->dirty_tx = dirty_tx;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3384
		smp_wmb();
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3385
		if (netif_queue_stopped(dev) &&
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3386
		    (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3387
			netif_wake_queue(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3388
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3389
		/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3390
		 * 8168 hack: TxPoll requests are lost when the Tx packets are
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3391
		 * too close. Let's kick an extra TxPoll request when a burst
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3392
		 * of start_xmit activity is detected (if it is not detected,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3393
		 * it is slow enough). -- FR
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3394
		 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3395
		smp_rmb();
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3396
		if (tp->cur_tx != dirty_tx)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3397
			RTL_W8(TxPoll, NPQ);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3398
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3399
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3400
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3401
static inline int rtl8169_fragmented_frame(u32 status)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3402
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3403
	return (status & (FirstFrag | LastFrag)) != (FirstFrag | LastFrag);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3404
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3405
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3406
static inline void rtl8169_rx_csum(struct sk_buff *skb, struct RxDesc *desc)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3407
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3408
	u32 opts1 = le32_to_cpu(desc->opts1);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3409
	u32 status = opts1 & RxProtoMask;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3410
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3411
	if (((status == RxProtoTCP) && !(opts1 & TCPFail)) ||
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3412
	    ((status == RxProtoUDP) && !(opts1 & UDPFail)) ||
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3413
	    ((status == RxProtoIP) && !(opts1 & IPFail)))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3414
		skb->ip_summed = CHECKSUM_UNNECESSARY;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3415
	else
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3416
		skb->ip_summed = CHECKSUM_NONE;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3417
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3418
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3419
static inline bool rtl8169_try_rx_copy(struct sk_buff **sk_buff,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3420
				       struct rtl8169_private *tp, int pkt_size,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3421
				       dma_addr_t addr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3422
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3423
	struct sk_buff *skb;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3424
	bool done = false;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3425
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3426
	if (pkt_size >= rx_copybreak)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3427
		goto out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3428
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3429
	skb = netdev_alloc_skb(tp->dev, pkt_size + NET_IP_ALIGN);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3430
	if (!skb)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3431
		goto out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3432
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3433
	pci_dma_sync_single_for_cpu(tp->pci_dev, addr, pkt_size,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3434
				    PCI_DMA_FROMDEVICE);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3435
	skb_reserve(skb, NET_IP_ALIGN);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3436
	skb_copy_from_linear_data(*sk_buff, skb->data, pkt_size);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3437
	*sk_buff = skb;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3438
	done = true;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3439
out:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3440
	return done;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3441
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3442
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3443
static int rtl8169_rx_interrupt(struct net_device *dev,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3444
				struct rtl8169_private *tp,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3445
				void __iomem *ioaddr, u32 budget)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3446
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3447
	unsigned int cur_rx, rx_left;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3448
	unsigned int delta, count;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3449
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3450
	cur_rx = tp->cur_rx;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3451
	rx_left = NUM_RX_DESC + tp->dirty_rx - cur_rx;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3452
	rx_left = min(rx_left, budget);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3453
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3454
	for (; rx_left > 0; rx_left--, cur_rx++) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3455
		unsigned int entry = cur_rx % NUM_RX_DESC;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3456
		struct RxDesc *desc = tp->RxDescArray + entry;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3457
		u32 status;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3458
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3459
		rmb();
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3460
		status = le32_to_cpu(desc->opts1);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3461
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3462
		if (status & DescOwn)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3463
			break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3464
		if (unlikely(status & RxRES)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3465
			if (netif_msg_rx_err(tp)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3466
				printk(KERN_INFO
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3467
				       "%s: Rx ERROR. status = %08x\n",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3468
				       dev->name, status);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3469
			}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3470
			dev->stats.rx_errors++;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3471
			if (status & (RxRWT | RxRUNT))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3472
				dev->stats.rx_length_errors++;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3473
			if (status & RxCRC)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3474
				dev->stats.rx_crc_errors++;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3475
			if (status & RxFOVF) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3476
				rtl8169_schedule_work(dev, rtl8169_reset_task);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3477
				dev->stats.rx_fifo_errors++;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3478
			}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3479
			rtl8169_mark_to_asic(desc, tp->rx_buf_sz);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3480
		} else {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3481
			struct sk_buff *skb = tp->Rx_skbuff[entry];
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3482
			dma_addr_t addr = le64_to_cpu(desc->addr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3483
			int pkt_size = (status & 0x00001FFF) - 4;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3484
			struct pci_dev *pdev = tp->pci_dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3485
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3486
			/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3487
			 * The driver does not support incoming fragmented
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3488
			 * frames. They are seen as a symptom of over-mtu
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3489
			 * sized frames.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3490
			 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3491
			if (unlikely(rtl8169_fragmented_frame(status))) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3492
				dev->stats.rx_dropped++;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3493
				dev->stats.rx_length_errors++;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3494
				rtl8169_mark_to_asic(desc, tp->rx_buf_sz);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3495
				continue;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3496
			}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3497
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3498
			rtl8169_rx_csum(skb, desc);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3499
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3500
			if (rtl8169_try_rx_copy(&skb, tp, pkt_size, addr)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3501
				pci_dma_sync_single_for_device(pdev, addr,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3502
					pkt_size, PCI_DMA_FROMDEVICE);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3503
				rtl8169_mark_to_asic(desc, tp->rx_buf_sz);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3504
			} else {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3505
				pci_unmap_single(pdev, addr, tp->rx_buf_sz,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3506
						 PCI_DMA_FROMDEVICE);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3507
				tp->Rx_skbuff[entry] = NULL;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3508
			}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3509
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3510
			skb_put(skb, pkt_size);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3511
			skb->protocol = eth_type_trans(skb, dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3512
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3513
			if (rtl8169_rx_vlan_skb(tp, desc, skb) < 0)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3514
				netif_receive_skb(skb);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3515
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3516
			dev->stats.rx_bytes += pkt_size;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3517
			dev->stats.rx_packets++;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3518
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3519
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3520
		/* Work around for AMD plateform. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3521
		if ((desc->opts2 & cpu_to_le32(0xfffe000)) &&
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3522
		    (tp->mac_version == RTL_GIGA_MAC_VER_05)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3523
			desc->opts2 = 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3524
			cur_rx++;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3525
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3526
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3527
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3528
	count = cur_rx - tp->cur_rx;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3529
	tp->cur_rx = cur_rx;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3530
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3531
	delta = rtl8169_rx_fill(tp, dev, tp->dirty_rx, tp->cur_rx);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3532
	if (!delta && count && netif_msg_intr(tp))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3533
		printk(KERN_INFO "%s: no Rx buffer allocated\n", dev->name);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3534
	tp->dirty_rx += delta;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3535
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3536
	/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3537
	 * FIXME: until there is periodic timer to try and refill the ring,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3538
	 * a temporary shortage may definitely kill the Rx process.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3539
	 * - disable the asic to try and avoid an overflow and kick it again
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3540
	 *   after refill ?
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3541
	 * - how do others driver handle this condition (Uh oh...).
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3542
	 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3543
	if ((tp->dirty_rx + NUM_RX_DESC == tp->cur_rx) && netif_msg_intr(tp))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3544
		printk(KERN_EMERG "%s: Rx buffers exhausted\n", dev->name);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3545
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3546
	return count;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3547
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3548
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3549
static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3550
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3551
	struct net_device *dev = dev_instance;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3552
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3553
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3554
	int handled = 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3555
	int status;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3556
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3557
	status = RTL_R16(IntrStatus);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3558
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3559
	/* hotplug/major error/no more work/shared irq */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3560
	if ((status == 0xffff) || !status)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3561
		goto out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3562
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3563
	handled = 1;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3564
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3565
	if (unlikely(!netif_running(dev))) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3566
		rtl8169_asic_down(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3567
		goto out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3568
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3569
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3570
	status &= tp->intr_mask;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3571
	RTL_W16(IntrStatus,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3572
		(status & RxFIFOOver) ? (status | RxOverflow) : status);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3573
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3574
	if (!(status & tp->intr_event))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3575
		goto out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3576
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3577
	/* Work around for rx fifo overflow */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3578
	if (unlikely(status & RxFIFOOver) &&
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3579
	    (tp->mac_version == RTL_GIGA_MAC_VER_11)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3580
		netif_stop_queue(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3581
		rtl8169_tx_timeout(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3582
		goto out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3583
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3584
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3585
	if (unlikely(status & SYSErr)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3586
		rtl8169_pcierr_interrupt(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3587
		goto out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3588
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3589
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3590
	if (status & LinkChg)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3591
		rtl8169_check_link_status(dev, tp, ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3592
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3593
	if (status & tp->napi_event) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3594
		RTL_W16(IntrMask, tp->intr_event & ~tp->napi_event);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3595
		tp->intr_mask = ~tp->napi_event;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3596
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3597
		if (likely(netif_rx_schedule_prep(&tp->napi)))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3598
			__netif_rx_schedule(&tp->napi);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3599
		else if (netif_msg_intr(tp)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3600
			printk(KERN_INFO "%s: interrupt %04x in poll\n",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3601
			       dev->name, status);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3602
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3603
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3604
out:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3605
	return IRQ_RETVAL(handled);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3606
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3607
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3608
static int rtl8169_poll(struct napi_struct *napi, int budget)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3609
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3610
	struct rtl8169_private *tp = container_of(napi, struct rtl8169_private, napi);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3611
	struct net_device *dev = tp->dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3612
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3613
	int work_done;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3614
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3615
	work_done = rtl8169_rx_interrupt(dev, tp, ioaddr, (u32) budget);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3616
	rtl8169_tx_interrupt(dev, tp, ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3617
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3618
	if (work_done < budget) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3619
		netif_rx_complete(napi);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3620
		tp->intr_mask = 0xffff;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3621
		/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3622
		 * 20040426: the barrier is not strictly required but the
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3623
		 * behavior of the irq handler could be less predictable
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3624
		 * without it. Btw, the lack of flush for the posted pci
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3625
		 * write is safe - FR
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3626
		 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3627
		smp_wmb();
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3628
		RTL_W16(IntrMask, tp->intr_event);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3629
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3630
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3631
	return work_done;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3632
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3633
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3634
static void rtl8169_rx_missed(struct net_device *dev, void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3635
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3636
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3637
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3638
	if (tp->mac_version > RTL_GIGA_MAC_VER_06)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3639
		return;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3640
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3641
	dev->stats.rx_missed_errors += (RTL_R32(RxMissed) & 0xffffff);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3642
	RTL_W32(RxMissed, 0);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3643
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3644
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3645
static void rtl8169_down(struct net_device *dev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3646
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3647
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3648
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3649
	unsigned int intrmask;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3650
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3651
	rtl8169_delete_timer(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3652
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3653
	netif_stop_queue(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3654
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3655
	napi_disable(&tp->napi);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3656
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3657
core_down:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3658
	spin_lock_irq(&tp->lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3659
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3660
	rtl8169_asic_down(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3661
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3662
	rtl8169_rx_missed(dev, ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3663
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3664
	spin_unlock_irq(&tp->lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3665
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3666
	synchronize_irq(dev->irq);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3667
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3668
	/* Give a racing hard_start_xmit a few cycles to complete. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3669
	synchronize_sched();  /* FIXME: should this be synchronize_irq()? */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3670
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3671
	/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3672
	 * And now for the 50k$ question: are IRQ disabled or not ?
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3673
	 *
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3674
	 * Two paths lead here:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3675
	 * 1) dev->close
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3676
	 *    -> netif_running() is available to sync the current code and the
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3677
	 *       IRQ handler. See rtl8169_interrupt for details.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3678
	 * 2) dev->change_mtu
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3679
	 *    -> rtl8169_poll can not be issued again and re-enable the
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3680
	 *       interruptions. Let's simply issue the IRQ down sequence again.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3681
	 *
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3682
	 * No loop if hotpluged or major error (0xffff).
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3683
	 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3684
	intrmask = RTL_R16(IntrMask);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3685
	if (intrmask && (intrmask != 0xffff))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3686
		goto core_down;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3687
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3688
	rtl8169_tx_clear(tp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3689
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3690
	rtl8169_rx_clear(tp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3691
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3692
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3693
static int rtl8169_close(struct net_device *dev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3694
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3695
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3696
	struct pci_dev *pdev = tp->pci_dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3697
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3698
	/* update counters before going down */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3699
	rtl8169_update_counters(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3700
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3701
	rtl8169_down(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3702
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3703
	free_irq(dev->irq, dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3704
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3705
	pci_free_consistent(pdev, R8169_RX_RING_BYTES, tp->RxDescArray,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3706
			    tp->RxPhyAddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3707
	pci_free_consistent(pdev, R8169_TX_RING_BYTES, tp->TxDescArray,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3708
			    tp->TxPhyAddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3709
	tp->TxDescArray = NULL;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3710
	tp->RxDescArray = NULL;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3711
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3712
	return 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3713
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3714
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3715
static void rtl_set_rx_mode(struct net_device *dev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3716
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3717
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3718
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3719
	unsigned long flags;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3720
	u32 mc_filter[2];	/* Multicast hash filter */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3721
	int rx_mode;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3722
	u32 tmp = 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3723
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3724
	if (dev->flags & IFF_PROMISC) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3725
		/* Unconditionally log net taps. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3726
		if (netif_msg_link(tp)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3727
			printk(KERN_NOTICE "%s: Promiscuous mode enabled.\n",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3728
			       dev->name);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3729
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3730
		rx_mode =
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3731
		    AcceptBroadcast | AcceptMulticast | AcceptMyPhys |
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3732
		    AcceptAllPhys;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3733
		mc_filter[1] = mc_filter[0] = 0xffffffff;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3734
	} else if ((dev->mc_count > multicast_filter_limit)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3735
		   || (dev->flags & IFF_ALLMULTI)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3736
		/* Too many to filter perfectly -- accept all multicasts. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3737
		rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3738
		mc_filter[1] = mc_filter[0] = 0xffffffff;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3739
	} else {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3740
		struct dev_mc_list *mclist;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3741
		unsigned int i;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3742
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3743
		rx_mode = AcceptBroadcast | AcceptMyPhys;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3744
		mc_filter[1] = mc_filter[0] = 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3745
		for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3746
		     i++, mclist = mclist->next) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3747
			int bit_nr = ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3748
			mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3749
			rx_mode |= AcceptMulticast;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3750
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3751
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3752
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3753
	spin_lock_irqsave(&tp->lock, flags);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3754
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3755
	tmp = rtl8169_rx_config | rx_mode |
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3756
	      (RTL_R32(RxConfig) & rtl_chip_info[tp->chipset].RxConfigMask);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3757
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3758
	if (tp->mac_version > RTL_GIGA_MAC_VER_06) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3759
		u32 data = mc_filter[0];
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3760
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3761
		mc_filter[0] = swab32(mc_filter[1]);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3762
		mc_filter[1] = swab32(data);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3763
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3764
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3765
	RTL_W32(MAR0 + 0, mc_filter[0]);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3766
	RTL_W32(MAR0 + 4, mc_filter[1]);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3767
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3768
	RTL_W32(RxConfig, tmp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3769
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3770
	spin_unlock_irqrestore(&tp->lock, flags);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3771
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3772
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3773
/**
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3774
 *  rtl8169_get_stats - Get rtl8169 read/write statistics
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3775
 *  @dev: The Ethernet Device to get statistics for
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3776
 *
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3777
 *  Get TX/RX statistics for rtl8169
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3778
 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3779
static struct net_device_stats *rtl8169_get_stats(struct net_device *dev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3780
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3781
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3782
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3783
	unsigned long flags;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3784
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3785
	if (netif_running(dev)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3786
		spin_lock_irqsave(&tp->lock, flags);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3787
		rtl8169_rx_missed(dev, ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3788
		spin_unlock_irqrestore(&tp->lock, flags);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3789
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3790
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3791
	return &dev->stats;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3792
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3793
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3794
#ifdef CONFIG_PM
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3795
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3796
static int rtl8169_suspend(struct pci_dev *pdev, pm_message_t state)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3797
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3798
	struct net_device *dev = pci_get_drvdata(pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3799
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3800
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3801
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3802
	if (!netif_running(dev))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3803
		goto out_pci_suspend;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3804
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3805
	netif_device_detach(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3806
	netif_stop_queue(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3807
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3808
	spin_lock_irq(&tp->lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3809
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3810
	rtl8169_asic_down(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3811
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3812
	rtl8169_rx_missed(dev, ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3813
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3814
	spin_unlock_irq(&tp->lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3815
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3816
out_pci_suspend:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3817
	pci_save_state(pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3818
	pci_enable_wake(pdev, pci_choose_state(pdev, state),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3819
		(tp->features & RTL_FEATURE_WOL) ? 1 : 0);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3820
	pci_set_power_state(pdev, pci_choose_state(pdev, state));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3821
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3822
	return 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3823
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3824
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3825
static int rtl8169_resume(struct pci_dev *pdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3826
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3827
	struct net_device *dev = pci_get_drvdata(pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3828
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3829
	pci_set_power_state(pdev, PCI_D0);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3830
	pci_restore_state(pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3831
	pci_enable_wake(pdev, PCI_D0, 0);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3832
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3833
	if (!netif_running(dev))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3834
		goto out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3835
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3836
	netif_device_attach(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3837
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3838
	rtl8169_schedule_work(dev, rtl8169_reset_task);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3839
out:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3840
	return 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3841
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3842
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3843
static void rtl_shutdown(struct pci_dev *pdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3844
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3845
	rtl8169_suspend(pdev, PMSG_SUSPEND);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3846
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3847
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3848
#endif /* CONFIG_PM */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3849
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3850
static struct pci_driver rtl8169_pci_driver = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3851
	.name		= MODULENAME,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3852
	.id_table	= rtl8169_pci_tbl,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3853
	.probe		= rtl8169_init_one,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3854
	.remove		= __devexit_p(rtl8169_remove_one),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3855
#ifdef CONFIG_PM
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3856
	.suspend	= rtl8169_suspend,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3857
	.resume		= rtl8169_resume,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3858
	.shutdown	= rtl_shutdown,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3859
#endif
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3860
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3861
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3862
static int __init rtl8169_init_module(void)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3863
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3864
	return pci_register_driver(&rtl8169_pci_driver);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3865
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3866
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3867
static void __exit rtl8169_cleanup_module(void)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3868
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3869
	pci_unregister_driver(&rtl8169_pci_driver);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3870
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3871
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3872
module_init(rtl8169_init_module);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3873
module_exit(rtl8169_cleanup_module);